1

次の例を検討してください。

#include <iostream>
#include <type_traits>

template <typename Type>
struct Something
{
    template <typename OtherType> 
    static constexpr bool same()
    {return std::is_same<Type, OtherType>::value;}
};

template <class Type>
struct Example
{
    static_assert(Type::template same<double>(), "ERROR");
};

int main()
{
    Example<Something<double>> example;
    return 0;
}

関数を実行して、渡されたstatic_assert型が何らかの条件を満たしているかどうかをチェックしsame()ます。

ここで、複数Typesを に渡すことができると考えてExampleください:

#include <iostream>
#include <type_traits>

template <typename Type>
struct Something
{
    template <typename OtherType> 
    static constexpr bool same()
    {return std::is_same<Type, OtherType>::value;}
};

template <class... Types>
struct Example
{
    static_assert(/* SOMETHING */, "ERROR");
};

int main()
{
    Example<Something<double>> example;
    return 0;
}

すべてのタイプで条件が検証されているかどうかを確認する代わりに、機能する構文はありますSOMETHINGか (ヘルパー関数の束なし: この方法で実行できることはわかっていますが、別の方法があるかどうか疑問に思います (どこかで単純なアンパックを使用するなど)。 ..))

4

2 に答える 2

0

を特殊化するだけで、ヘルパー関数なしで実行できます template Example

現実の世界Exampleで、可変引数のためだけに特化したくないクラスがある場合は、 可変引数 を独自のテンプレートの特殊static_assert化でカプセル化し、現実のクラスに対応するインスタンス化を継承させることができます。static_assertこれは、特化した図ですExample

#include <iostream>
#include <type_traits>

template <typename Type>
struct Something
{
    template <typename OtherType> 
    static constexpr bool same()
    {return std::is_same<Type, OtherType>::value;}
};

template<class ...Types>
struct Example;

template<>
struct Example<>{};

template<class T>
struct Example<T>
{
    static_assert(T::template same<double>(), "ERROR");
};

template<class First, class ...Rest>
struct Example<First,Rest...> : Example<Rest...>
{
    static_assert(First::template same<double>(), "ERROR");
};

int main()
{
    Example<Something<double>> example0; // OK
    Example<Something<double>,Something<double>> example1; // OK
    Example<Something<int>> example2; // Error
    Example<Something<double>,Something<int>> example3; // Error
    Example<Something<double>,Something<double>,Something<int>> example4; // Error
    Example<Something<double>,Something<int>,Something<double>> example5; // Error
    return 0;
}
于 2013-07-26T11:16:12.557 に答える