1

私は次のことをしようとしています: テンプレート化されたクラスは、テンプレート化された型に特定の名前のメンバー変数が含まれているかどうかに応じて、いくつかの関数を提供する必要があります。例として、テンプレート化された構造体/クラスに「id」というメンバーがある場合にのみ「printid()」を提供する必要がある次の擬似コード:

#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、trait、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 { };

どんな助けでも感謝します。

4

1 に答える 1