例如,我已经声明了一个通用模板:
template <class T>
void foo(T value);
Run Code Online (Sandbox Code Playgroud)
但是我需要每个类型的程序员都必须声明其专业化:
struct my_user_t
{
// ...
};
template <>
void foo<my_user_t>(my_user_t value) {
// ...
}
// Somewhere in big program:
my_user_t my_value;
foo(my_value);
Run Code Online (Sandbox Code Playgroud)
现在如果程序员忘记为他的用户类型专门化模板,链接器会说它找不到符号,而不是编译器。所以在大程序中很难找到它被使用的地方。
我如何声明模板,如:
template <class T>
void foo(T value) {
static_assert(???, "You must specialize foo<> for your type");
}
Run Code Online (Sandbox Code Playgroud)
这样编译器(不是链接器)会说我在哪里使用foo(my_user_t)
不正确?
只需组成一些依赖于模板参数类型的东西:
template<typename T>
struct always_false : std::false_type {};
template <class T>
void foo(T value) {
static_assert(always_false<T>::value , "You must specialize foo<> for your type");
}
Run Code Online (Sandbox Code Playgroud)
或者,我认为您可以将默认函数模板声明为已删除:
template <class T>
void foo(T value)=delete;
Run Code Online (Sandbox Code Playgroud)