A Cを++ 11ソリューションは、U
がS
ベースのタイプである場合、第1または第2のコンストラクタを有効にして、SFINAEに基づくことができます。
これを行うには、型があるかどうかを検出する型の特性を開発することが役に立ちます(S
)。
template <typename V = U>
A(T & t, bool b,
typename std::enable_if<false == isS<V>::value>::type * = nullptr)
: U(t, b)
{ std::cout << "generic A constructor" << std::endl; }
template <typename V = U>
A(T & t, bool b,
typename std::enable_if<true == isS<V>::value>::type * = nullptr)
: U(t, b, false)
{ std::cout << "S specific A constructor" << std::endl; }
を次のように例
template <typename>
struct isS : public std::false_type
{ };
template <typename T>
struct isS<S<T>> : public std::true_type
{ };
isS
とによって、あなたはS
のテンプレート引数が必要な場合は、あなたがの特殊化を定義することができます(A
クラスのボディに)あなたのコンストラクタを書くことができますisS
template <typename T>
struct isS<S<T>> : public std::true_type
{ using type = T; };
をたどり、typename isS<V>::type
としてそれを使用して。
フル実施例
#include <vector>
#include <iostream>
#include <type_traits>
template <typename T>
struct S
{
S (T const &, bool, bool)
{ std::cout << "S constructor" << std::endl; }
};
template <typename>
struct isS : public std::false_type
{ };
template <typename T>
struct isS<S<T>> : public std::true_type
{ };
template <typename T, typename U>
struct A : public U
{
template <typename V = U>
A(T & t, bool b,
typename std::enable_if<false == isS<V>::value>::type * = nullptr)
: U(t, b)
{ std::cout << "generic A constructor" << std::endl; }
template <typename V = U>
A(T & t, bool b,
typename std::enable_if<true == isS<V>::value>::type * = nullptr)
: U(t, b, false)
{ std::cout << "S specific A constructor" << std::endl; }
};
int main()
{
long l { 0L };
// print "generic A constructor"
A<long, std::vector<int>> alv(l, true);
// print "S constructor>" and "S specific A constructor"
A<long, S<int>> als(l, true);
}
見て:あなたが必要https://stackoverflow.com/questions/11310898/how-do-i-get-the-type-of-a-variable –
C++ 98ソリューション、またはC++ 11/C++ 14ソリューションも受け入れますか? – max66
C++ 11がベストだろうが、私も14を取るだろう – shane