j_k*_*bik 5 c++ templates specialization
是否有可能以某种方式禁止对未明确写入特化的类型使用模板化函数.我的意思是这样的
template <typename T>
void foo(){}
template <>
void foo<int>(){}
int main(int argc, char* argv[]){
foo<int>(); //ok
foo<char>(); //Wrong - no specialized version for char.
}
Run Code Online (Sandbox Code Playgroud)
我不能跳过通用版本的函数,因为然后编译器说,当我尝试专门化时,foo不是模板函数.我可以简单地编写一些不能在泛型函数中编译的东西,并添加一些解释原因的注释,但这将是非常无用的信息.我想做的是,能够直接导致编译器出现错误,例如"foo()未定义".
Jam*_*lis 13
当然:只是不定义它,如果你试图使用它你会得到一个链接器错误:
template <typename T>
void foo(); // not defined
template <>
void foo<int>() { }
Run Code Online (Sandbox Code Playgroud)
或者,您可以使用静态断言的某些变体来提供"更好"的编译时错误.这是使用C++ 0x的示例static_assert
.请注意,您必须使false
值取决于模板参数,否则static_assert
可能在解析模板时触发.
template <typename T>
struct dependent_false { enum { value = false }; };
template <typename T>
void foo()
{
static_assert(dependent_false<T>::value, "Oops, you used the primary template");
}
Run Code Online (Sandbox Code Playgroud)
请注意,通常最好不要专门化功能模板.相反,最好委托给专门的类模板:
template <typename T>
struct foo_impl
{
static_assert(dependent_false<T>::value, "Oops, you used the primary template");
};
template<>
struct foo_impl<int>
{
static void foo() { }
};
template <typename T>
void foo()
{
return foo_impl<T>::foo();
}
Run Code Online (Sandbox Code Playgroud)