Я пытаюсь сделать следующее: шаблонный класс должен предоставлять некоторые функции, зависящие от того, содержит ли тип, для которого он был создан в шаблоне, переменную-член с заданным именем. В качестве примера приведен следующий псевдокод, который должен предоставлять "printid ()" только тогда, когда шаблонная структура / класс имеет член с именем "id":
#include <iostream>
#include <type_traits>
struct A { int id; };
struct B { };
template<typename T>
class foo
{
T myvar;
public:
#if exists T.id (or the alternative: #if exists myvar.id)
printid() { std::cout << "I have element id."; }
#endif
};
int main(){
foo<A> ok;
ok.printid(); // should compile and execute
foo<B> nok;
nok.printid(); // should not compile
return 0;
}
Копаясь в SFINAE, traits, std :: enable_if и StackOverflow, я думаю, что это можно сделать ... как-нибудь. Но мне почему-то не удается объединить enable_if со следующим фрагментом из вопроса Как определить, есть ли в классе конкретная переменная-член?:
template<typename T, typename = void>
struct has_id : std::false_type { };
template<typename T>
struct has_id<T, decltype(std::declval<T>().id, void())> : std::true_type { };
Любая помощь приветствуется.