Pie*_*igi 4 c++ templates specialization
假设我有一组继承自单个超类S的类:
class S{ ... };
class C1 : public S{ ... };
class C2 : public S{ ... };
Run Code Online (Sandbox Code Playgroud)
然后假设我有一个模板化的方法:
template<class T> void foo(T* instance);
Run Code Online (Sandbox Code Playgroud)
我想静态检查foo从未被调用提供超类的实例,但只调用提供其中一个(具体)子类(例如显式调用foo<C1>(x)实例)
这可能吗?
Tar*_*ama 10
首先,我们可以编写一个特征来检查是否T来自S,但不是S:
template <class Base, class Derived>
using is_strict_base =
std::integral_constant<bool,
std::is_base_of<Base,Derived>::value &&
!std::is_same<Base,typename std::remove_cv<Derived>::type>::value>;
Run Code Online (Sandbox Code Playgroud)
您可以使用std::enable_if此特征:
template<class T>
typename std::enable_if<is_strict_base<S,T>::value>::type
foo(T* instance)
{}
Run Code Online (Sandbox Code Playgroud)
使用C++ 14,您可以使用std::enable_if_t它来使它更漂亮:
template<class T>
std::enable_if_t<is_strict_base<S,T>::value>
foo(T* instance)
{}
Run Code Online (Sandbox Code Playgroud)
另一种选择是使用static_assert:
template<class T>
void foo(T* instance)
{
static_assert(is_strict_base<S,T>::value,
"T must be derived from S, but not S");
}
Run Code Online (Sandbox Code Playgroud)
这给你一个更好的错误,但我个人认为函数的类型约束属于声明.