c ++:模板声明中is_member_function_pointer的语法

时间:2013-09-18 14:29:59

标签: c++ templates

我有一个模板,其声明类似于:

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

我有两个版本的模板,我想在Arg0是成员函数指针时使用一个,否则使用另一个。我正在尝试使用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() {}

但这显然在语法上不正确。

2 个答案:

答案 0 :(得分:2)

将布尔谓词与类一起使用时,通常有两种方法可供选择:

  1. 如果我只需要在两种类型中进行选择,我会使用像

    这样的声音
    typename std::conditional<
        std::is_member_function_pointer<F>::value,
            type_when_true, type_when_false>::type
    
  2. 如果事情需要改变的话,我需要从一个专门用于布尔的基础派生出来,涵盖两个实现选择:

    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.
    };
    

答案 1 :(得分: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;
}