禁用模板但允许专业化

vla*_*don 3 c++ templates

例如,我已经声明了一个通用模板:

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)不正确?

krz*_*zaq 6

只需组成一些依赖于模板参数类型的东西:

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)

  • 对于足够聪明的编译器来说,这仍然是格式错误的 NDR :) (5认同)
  • 是的,这几乎是这样做的规范方式。 (2认同)