3
如何使模板類Collection<K,T>
接收函數T
- 可以有簽名T(K)
或T(K,int)
- 作爲模板參數,然後有條件地編譯基於函數的簽名?作爲模板參數:if(T receive 2 param)T(a,b);否則T(a);
以下是可以接收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'已經有忽略其他參數一定的支持:http://coliru.stacked-crooked.com/a/ab538d4302311c64 – dyp
@dyp謝謝。它非常接近,但我不知道如何將其應用於此案例(模板)。而且,調用類時不需要修改(因此,需要修改這個類的許多用戶)。我想聽聽。 :) – javaLover