【发布时间】:2016-09-15 09:34:10
【问题描述】:
如何使模板类Collection<K,T> 接收一个函数T - 可以具有签名T(K) 或T(K,int) - 作为模板参数,然后根据函数的签名有条件地编译?
这是可以接收 1 个签名的现有代码:Collection<K,HashFunction(K)>。
template<typename AA> using HashFunction= HashStruct& (*)(AA );
/** This class is currently used in so many places in codebase. */
template<class K,HashFunction<K> T> class Collection{
void testCase(){
K k=K();
HashStruct& hh= T(k); /*Collection1*/
//.... something complex ...
}
};
我希望它也支持Collection<K,HashFunction(K,int)>。
template<class K,HashFunction<K> T /* ??? */> class Collection{
int indexHash=1245323;
void testCase(){
K k=K();
if(T receive 2 parameter){ // ???
HashStruct& hh=T(k,this->indexHash); /*Collection2*/ // ???
//^ This is the heart of what I really want to achieve.
//.... something complex (same) ...
}else{
HashStruct& hh=T(k); /*Collection1*/
//.... something complex (same) ...
}
}
};
我是否别无选择,只能创建 2 个不同的类:Collection1 和 Collection2?
需要超过 c++11 的答案是可以的,但不太可取。
我觉得可以通过“默认参数”的技巧来解决。
【问题讨论】:
-
IIRC,
std::bind已经支持忽略其他参数:coliru.stacked-crooked.com/a/ab538d4302311c64 -
@dyp 谢谢。它是如此接近,但我不知道如何将它用于这种情况(模板)。而且,在调用类的时候是不是需要修改(所以这个类的很多用户都要修改)?我想听听。 :)
标签: c++ templates c++11 template-classes