我正在尝试为我定义的任意数量的特定类型层次结构聚合成员变量的值。
使用可变参数模板函数,这很容易做到。
当我尝试将调用此模板的函数名称作为字符串作为第一个参数传递时,我运气不太好。 这很难解释,所以下面是一些我必须演示我正在尝试做的事情的代码。
尝试编译此结果: 错误 C2993:“std::string”:非类型模板参数“str”的非法类型
我试图做的事情是不可能的吗?还是我只是以错误的方式解决了这个问题?
std::ostringstream output;
int objCounter = 0;
void set_results() {
output << "\n" << std::endl;
}
template <typename obj, typename ...objs>
void set_results(obj objHead, objs... objTail) {
++objCounter;
output << "Argument (" << objCounter << ") \t" << objHead.bytes << std::endl;
set_results(objTail...);
}
template <std::string str, typename ...objs>
void set_results(std::string objHead, objs... objTail) {
output << "Leaf Function: " << objHead << std::endl;
set_results(objTail...);
}
class objDep {
public:
int bytes;
objDep(int b) : bytes(b) {}
};
int _tmain(int argc, _TCHAR* argv[])
{
objDep one(1);
objDep two(2);
objDep three(3);
objDep four(4);
set_results(std::string("main"), one, two, three, four);
std::cout << output.str() << std::endl;
return 0;
}
最佳答案
改变
template <std::string str, typename ...objs>
void set_results(std::string objHead, objs... objTail) {
output << "Leaf Function: " << objHead << std::endl;
set_results(objTail...);
}
到:
template <typename ...objs>
void set_results(std::string objHead, objs... objTail) {
output << "Leaf Function: " << objHead << std::endl;
set_results(objTail...);
}
您不能有 std::string
类型的模板参数,无论如何,您完全不清楚您打算让 str
表示什么。
请注意,函数模板不能部分特化。通过此替换,您将拥有两个 set_results
的重载。将选择带有 std::string
参数的那个,因为它更专业。
关于c++ - 可变参数模板函数的特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24815337/