LINUX.ORG.RU

История изменений

Исправление 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);
}