如何将覆盖结构模板类型或变量模板类型传递给函数?

时间:2014-10-03 16:06:28

标签: c++

我甚至不确定这叫做什么。

我希望做这样的事情......有一个函数,它将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);
}

2 个答案:

答案 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 )