函数模板:具有类型特征的不同特化

gex*_*ide 6 c++ templates type-traits function-templates

考虑类模板,可以使用类型特征和虚拟启用模板参数为某些类型的组提供模板特化.我早些时候已经问过了.

现在,我对函数模板需要相同的东西:即,我有一个模板函数,并希望对一组类型进行特化,例如,所有类型都是类的子类型X.我可以用这样的类型特征来表达这个:

std::enable_if<std::is_base_of<X, T>::value>::type
Run Code Online (Sandbox Code Playgroud)

我想过这样做:

template <typename T, typename ENABLE = void>
void foo(){
    //Do something
}

template <typename T>
void foo<T,std::enable_if<std::is_base_of<A, T>::value>::type>(){
    //Do something different
}
Run Code Online (Sandbox Code Playgroud)

但是,这不起作用,因为功能模板不允许部分特化.那么怎么做呢?也许类型为trait的默认参数为type?但是代码怎么样呢?

Ker*_* SB 7

重载:

void foo_impl(T, std::false_type);

void foo_impl(T, std::true_type);

foo(T t) { foo_impl(t, std::is_base_of<A, T>()); }
Run Code Online (Sandbox Code Playgroud)


eca*_*mur 4

最接近您要求的是enable_if返回类型:

template<typename T> typename std::enable_if<std::is_same<T, int>::value>::type foo();
template<typename T> typename std::enable_if<std::is_same<T, char>::value>::type foo();
Run Code Online (Sandbox Code Playgroud)

然而,分派到辅助函数或类可能更具可读性和效率。

辅助功能:

template<typename T> void foo_helper(std::true_type);
template<typename T> void foo_helper(std::false_type);
template<typename T> void foo() { foo_helper(std::is_same<T, int>()); }
Run Code Online (Sandbox Code Playgroud)

辅助类:

template<typename T, bool = std::is_same<T, int>::value> struct foo_helper {};
template<typename T> struct foo_helper<T, true> { static void foo(); };
template<typename T> struct foo_helper<T, false> { static void foo(); };
template<typename T> void foo() { foo_helper<T>::foo(); }
Run Code Online (Sandbox Code Playgroud)