История изменений
Исправление KivApple, (текущая версия) :
Да, отлично работает. Только возникает вопрос, что делать, если интересующий меня метод принимает аргументы. Пока сделал так (допустим, someMethod принимает два аргумента - int& и int):
template<typename T> static constexpr auto hasSomeMethod(
T*,
int *a,
int b
) -> decltype(std::declval<T>().someMethod(*a, b), true) {
return true;
}
template<typename T> static constexpr auto hasSomeMethod(...) {
return false;
}
...
if constexpr (hasSomeMethod<T>(
(T*) 0,
(int*) 0,
0
)) {
t.someMethod(a, b);
}
Немного не нравится, что надо для каждого аргумента конструировать некое пустое значение, но, наверное, иначе никак.
Исходная версия KivApple, :
Да, отлично работает. Только возникает вопрос, что делать, если интересующий меня метод принимает аргументы. Пока сделал так (допустим, someMethod принимает два аргумента - int& и int):
template<typename T> static constexpr auto hasSomeMethod(
T*,
int *a,
int b
) -> decltype(std::declval<T>().someMethod(*a, b), true) {
return true;
}
template<typename T> static constexpr auto hasSomeMethod(...) {
return false;
}
...
if constexpr (hasSomeMethod<T>(
(T*) 0,
(int*) 0,
0
)) {
t.someMethod(a, b);
}