私は戻り値を決定するためにテンプレート型をとる関数を持っています。テンプレートの型がテンプレートクラスのインスタンス化であるかどうかをコンパイル時に伝える方法はありますか?テンプレートタイプがテンプレートクラスのインスタンスであるかどうかを確認するには?
Ex。
class First { /* ... */ };
template <typename T>
class Second { /* ... */ };
using MyType = boost::variant<First, Second<int>, Second<float>>;
template <typename SecondType>
auto func() -> MyType {
static_assert(/* what goes here?? */, "func() expects Second type");
SecondType obj;
// ...
return obj;
}
MyType obj = func<Second<int>>();
私は型がテンプレートクラスのインスタンス化であるかどうかをテストする方法があるかどうか、私は一般的にはちょうど好奇心が強い
template <typename T>
auto func() -> MyType {
static_assert(std::is_same<T, int>::value || std::is_same<T, float>::value,
"func template must be type int or float");
Second<T> obj;
// ...
return obj;
}
MyType obj = func<int>();
を行うことによってこの問題を回避することが可能である知っていますか? MyType
に6 Second
のインスタンスがあると、すべての可能なタイプをテストする必要はありません。ここで
あなたは 'Second'を変更できますか? 'std :: true_type isSecond'メンバを追加できれば簡単です – Caleth
可能なdupe [型がテンプレートであるかどうかをチェックするためにC++型の特性を使う方法はありますか?](http://stackoverflow.com/questions/13919234/is-there-a-way-c-type-traits-to-a-a-type-if-a-template-and-any-pr)は何ですか? – George