在基于 class 的模板中使用可变模板完美转发?
Prefect Forwarding in a template based class with variadic templates?
我尝试实现一个模板库 class。它采用一个字符串和 n 个参数,并基于字符串将所有给定参数传递给使用完美转发的某个函数。
我为此编写了示例代码。
template <typename T, typename ... Args>
class temp {
public:
temp(){};
~temp(){};
T main_fn(const std::string& a, Args&& ... args){
if(a == "add"){
return add(std::forward<Args>(args)...);
}
else if(a == "sub"){
return sub(std::forward<Args>(args)...);
}
else{
std::cout << "abc" << std::endl;
}
}
};
int main(){
std::cout << std::endl;
temp<int>* temp_obj = new temp<int>();
const std::string fn = "add";
int result = temp_obj->main_fn(fn, 1,2,3);
std::cout << result << std::endl;
}
当我尝试编译此代码时出现以下错误。
In function 'int main()':
70:43: error: no matching function for call to 'temp<int>::main_fn(const string&, int, int, int)'
70:43: note: candidate is:
40:11: note: T temp<T, Args>::main_fn(const string&, Args&& ...) [with T = int; Args = {}; std::string = std::basic_string<char>]
40:11: note: candidate expects 1 argument, 4 provided
如有任何帮助,我们将不胜感激。
temp<int>
有成员函数main_fn(const std::string& a)
,因为temp<int>
中没有进一步的Args...
。
如果你想参数化 T
上的 class 但更多 Args...
上的方法,那么你可以这样写:
#include <iostream>
#include <string>
template <typename T>
class temp {
public:
temp(){};
~temp(){};
template <typename ... Args>
T main_fn(const std::string& a, Args&& ... args){
return 42;
}
};
int main(){
std::cout << std::endl;
temp<int>* temp_obj = new temp<int>();
const std::string fn = "add";
int result = temp_obj->main_fn(fn, 1,2,3);
std::cout << result << std::endl;
}
我尝试实现一个模板库 class。它采用一个字符串和 n 个参数,并基于字符串将所有给定参数传递给使用完美转发的某个函数。 我为此编写了示例代码。
template <typename T, typename ... Args>
class temp {
public:
temp(){};
~temp(){};
T main_fn(const std::string& a, Args&& ... args){
if(a == "add"){
return add(std::forward<Args>(args)...);
}
else if(a == "sub"){
return sub(std::forward<Args>(args)...);
}
else{
std::cout << "abc" << std::endl;
}
}
};
int main(){
std::cout << std::endl;
temp<int>* temp_obj = new temp<int>();
const std::string fn = "add";
int result = temp_obj->main_fn(fn, 1,2,3);
std::cout << result << std::endl;
}
当我尝试编译此代码时出现以下错误。
In function 'int main()':
70:43: error: no matching function for call to 'temp<int>::main_fn(const string&, int, int, int)'
70:43: note: candidate is:
40:11: note: T temp<T, Args>::main_fn(const string&, Args&& ...) [with T = int; Args = {}; std::string = std::basic_string<char>]
40:11: note: candidate expects 1 argument, 4 provided
如有任何帮助,我们将不胜感激。
temp<int>
有成员函数main_fn(const std::string& a)
,因为temp<int>
中没有进一步的Args...
。
如果你想参数化 T
上的 class 但更多 Args...
上的方法,那么你可以这样写:
#include <iostream>
#include <string>
template <typename T>
class temp {
public:
temp(){};
~temp(){};
template <typename ... Args>
T main_fn(const std::string& a, Args&& ... args){
return 42;
}
};
int main(){
std::cout << std::endl;
temp<int>* temp_obj = new temp<int>();
const std::string fn = "add";
int result = temp_obj->main_fn(fn, 1,2,3);
std::cout << result << std::endl;
}