阻塞非专门化的c++模板
block non-specialized template c++
是否可能以某种方式禁止对未显式编写专门化的类型使用模板化函数?我的意思是像这样
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();
}
当然,只是不要为默认的泛型模板提供定义。
相关文章:
- .cpp和.h文件中的模板专用化声明
- C++模板来检查友元函数的存在
- 如何使用默认参数等选择模板专业化
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- 部分定义/别名模板模板参数
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 如何在c++中为模板函数实例创建快捷方式
- 使用C++中的模板和运算符重载执行矩阵运算
- 有人能分解一下这个c++模板的语法吗
- 如何在c++17中制作一个模板包装器/装饰器
- 模板化建造师专业化
- 调用专用模板时出错"no matching function for call to [...]"
- 模板元程序查找相似的连续类型名称
- 如何在C++20中创建模板别名的推导指南
- 没有名称的C++模板参数
- 具有重复类型的C++可变模板
- 如何将enable-if与模板参数和参数包一起使用
- 没有用于初始化C++中的变量模板的匹配构造函数