Я пытаюсь предоставить небольшую специализацию класса, когда 2 предоставленных типа похожи, и я достиг следующего кода, который работает:
template<typename Fn, typename U, typename V>
class K {
public:
K(Fn f, U u, V v) : u_(u), v_(v) {
std::cout << "2 args\n";
}
private:
V v_;
U u_;
};
template<typename Fn, typename U>
class K<Fn, U, U> {
public:
K(Fn f, U u) : u_(u) {
std::cout << "1 args\n";
}
private:
U u_;
};
void koo(int i, double d) {}
void moo(int i) {}
int main() {
K(koo, 3, 5.6);
K<decltype(moo), int, int>(moo, 3);
}
Моя единственная проблема заключается в том, что для выбора специализации я должен предоставить <decltype(moo), int, int>
вручную или специализация не будет выбрана. Интересно, можно ли выбрать эту специализацию на основе одного аргумента конструктора, чтобы K(moo,3);
тоже работал. Есть идеи?