3

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

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() {}

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

4

2 回答 2

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.
    };
    
于 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 回答