我有一个模板,其声明类似于:
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() {}
但这显然在语法上不正确。
答案 0 :(得分:2)
将布尔谓词与类一起使用时,通常有两种方法可供选择:
如果我只需要在两种类型中进行选择,我会使用像
这样的声音typename std::conditional<
std::is_member_function_pointer<F>::value,
type_when_true, type_when_false>::type
如果事情需要改变的话,我需要从一个专门用于布尔的基础派生出来,涵盖两个实现选择:
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;
}