Хочу, чтобы шаблонная функция делала какую-то работу и по возможности в определённый момент времени вызывала метод класса. Но если этого метода нет, то ничего страшного.
template<typename T> void f(T &t, int a, int b) {
std::cout << a << std::endl;
t.someMethod(a, b); // Если T не имеет someMethod, эта строчка должна быть проигнорирована, но остальные исполняться как раньше
std::cout << b << std::endl;
}
Я знаю, что есть SFINAE, так что могу написать так:
template<typename T> void f(T &t, int a, int b) {
std::cout << a << std::endl;
t.someMethod(a, b);
std::cout << b << std::endl;
}
template<typename T> void f(T &t, int a, int b) {
std::cout << a << std::endl;
std::cout << b << std::endl;
}
То есть две версии шаблона для двух случаев. Если у T нет someMethod, то первый шаблон будет проигнорирован. Проблема в том, что если у T есть someMethod, то получится две функции с одинаковой сигнатурой. А на практике компилятор вообще видит, что я пытаюсь объявить два раза шаблон с одинаковой сигнатурой и ругается сразу, не дожидаясь попытки использовать шаблон с классом имеющим someMethod.
Как можно сделать опциональный вызов метода класса из шаблона?