3

次のような宣言を含むテンプレートがあります。

template <typename Arg0, typename... Args>
class blah {};

テンプレートには 2 つのバージョンがあり、Arg0 がメンバー関数ポインターの場合は 1 つを使用し、それ以外の場合はもう 1 つを使用します。std::enable_if と std::is_member_function_pointer を使用しようとしていますが、正しい構文が見つかりません。これは私が本当の場合のために持っているものです:

template<typename = typename std::enable_if< std::is_member_function_pointer<Arg0> >::type, typename... Args>
class blah() {}

しかし、これは明らかに構文的に正しくありません。

4

2 に答える 2

2

クラスでブール述語を使用する場合、一般に、選択を行うために使用する 2 つのアプローチがあります。

  1. 2つのタイプから選択する必要がある場合は、次のようなsonethを使用します

    typename std::conditional<
        std::is_member_function_pointer<F>::value,
            type_when_true, type_when_false>::type
    
  2. それ以上の変更が必要な場合は、2 つの実装の選択肢をカバーする Boolean に特化したベースから派生させます。

    template <bool, typename...>
    struct helper;
    
    template <typename... A>
    struct helper<true, A...> {
        // implementation 1
    };
    template <typename... A>
    struct helper<false, A...> {
        // the other 1
    };
    template <typename F, typename... A>
    struct actual
        : helper<std::is_member_function_pointer<F>::value, F, A...>
    {
        // typedefs, using ctors, common code, etc.
    };
    
于 2013-09-18T14:51:15.453 に答える
1

「通常の」部分的な特殊化で十分でしょうか?

template<class Arg0>
struct blah { bool value = false; };

template<class Ret, class C, class... Args>
struct blah < Ret (C::*)(Args...) >
{ bool value = true; };

struct test
{
    int foo(double&);
};

#include <iostream>
#include <iomanip>
int main()
{
    std::cout << std::boolalpha;
    std::cout << blah<decltype(&test::foo)>().value << std::endl;
    std::cout << blah<int>().value << std::endl;
}
于 2013-09-18T14:47:19.603 に答える