Как создать класс шаблона Collection<K,T>
получить функцию T
- это может либо иметь подпись T(K)
, либо T(K,int)
- в качестве аргумента шаблона, то условно скомпилировать базу подписи функции?Функция в качестве параметра шаблона: if (T получает 2 параметра) 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 в порядке, но менее предпочтительным.
Я чувствую, что он может быть разрешен с помощью трюка «default parameter».
IIRC, 'станд :: bind' уже имеет некоторую поддержку игнорируя дополнительные аргументы: http://coliru.stacked-crooked.com/a/ab538d4302311c64 – dyp
@dyp Спасибо. Это так близко, но я не знаю, как принять его в этом случае (шаблон). Более того, не требуется ли модификация при вызове класса (Таким образом, так много пользователей этого класса должны быть изменены)? Я хотел бы услышать. :) – javaLover