阻塞非专门化的c++模板

block non-specialized template c++

本文关键字:c++ 模板 专门化      更新时间:2023-10-16

是否可能以某种方式禁止对未显式编写专门化的类型使用模板化函数?我的意思是像这样

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.
}

我不能跳过函数的泛型版本,因为当我尝试特化时编译器说foo不是模板函数。我可以简单地写一些不能在泛型函数中编译的东西,并添加一些解释原因的注释,但这将是非常有意义的。我想做的是能够直接导致编译器出现错误,如"foo()未定义"。

当然:只是不要定义它,如果你试图使用它,你会得到一个链接错误:

template <typename T>
void foo(); // not defined
template <>
void foo<int>() { }

或者,您可以使用静态断言的某种变体来提供"更好的"编译时错误。下面是一个使用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");
}

注意,通常最好不要专门化函数模板。相反,最好将其委托给专门的类模板:

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

当然,只是不要为默认的泛型模板提供定义。