我甚至不确定这叫做什么。
我希望做这样的事情......有一个函数,它将arg作为一个带有两个模板的模板类型的引用,但其中一个不是一成不变的。
我的问题是我应该用什么代替WHAT_DO_I_PUT_HERE
来编译它?我尝试了各种各样的东西,比如传递void和“struct Hash”(第二个模板声明为class Hash = hash<Value>
)
注意:我不能使用c ++ 11。
void doTest(std::tr1::unordered_set<std::string, WHAT_DO_I_PUT_HERE> &set) {
...
}
struct HashStructOne {
size_t operator()(const std::string &item) const {...}
};
struct HashStructTwo {
size_t operator()(const std::string &item) const {...}
};
int main() {
std::tr1::unordered_set<std::string, HashStructOne> set1;
std::tr1::unordered_set<std::string, HashStructTwo> set2;
doTest(set1);
doTest(set2);
}
答案 0 :(得分:3)
您可以执行以下操作:
template<typename PUT_SOMETHING_HERE>
void doTest(std::tr1::unordered_set<std::string, PUT_SOMETHING_HERE> &set) {
...
}
模板参数的名称不必是任何特定的,它只需匹配您希望替换类型的函数参数的模板中的名称。
答案 1 :(得分:2)
最简单的解决方案
void doTest(std::tr1::unordered_set<std::string, WHAT_DO_I_PUT_HERE> &set) {
...
}
......只是
template< class Foo >
void doTest( std::tr1::unordered_set<std::string, Foo>& set )
{
...
}
我发现将类型名称传递给测试函数(用于输出)也很有用,因为来自typeid(T).name()
的名称不能保证可读性,尤其是对于g ++。
然后我只定义一个像
这样的宏#define DO_TEST( Type ) test<Type>( #Type )