有时,在使用C++模板进行编码时,您希望阻止用户实例化特定的特化或一组特化,因为结果将是荒谬的.因此,您可以定义(特定或部分)特化,如果实例化,其定义将导致编译器错误.如果用户"误用"模板,目标将是在头文件中的注释旁边引发编译器错误,解释不应该做什么,而不是让编译器自己提出一些令人困惑的错误消息设备,或者可能允许编译可疑代码.
例:
template <typename T> struct MyClassTemplate {
// ...
};
template <typename T> struct MyClassTemplate<T*> {
// Do not use MyClassTemplate with a pointer type!
typedef typename T::intentional_error err;
};
Run Code Online (Sandbox Code Playgroud)
有很多方法可以做到这一点(取决于你的专业化是一个类或函数的完全或部分特化).但是使用的语法必须(?)依赖于模板参数,否则编译器会在首次解析故意错误定义时抱怨.上面的例子有一个漏洞,有人可能会顽固地定义一个intentional_error嵌套类型或成员typedef(虽然我会说他们会因此而得到任何问题).但是,如果你使用的技巧过于花哨,你很可能会得到一个难以理解和/或误导性的编译器错误消息,这大部分都会失败.
是否有更好的直接方法来禁止模板实例化?
我知道在C++ 0x中,模板Concepts和删除的函数声明将更好地控制这类事情,但我正在寻找有效的C++ 03答案.
在模板函数的特定实例化上进行C++失败编译说明如果使用特定类实例化函数而不是如何使用类来实现编译失败.
说我有一节课:
template<class T>
class foo;
Run Code Online (Sandbox Code Playgroud)
而另一个class Bar.如果foo被实例化或专门用于编译,我将如何使编译失败Bar?
所有解决方案都像运行时一样(即使评估是在编译时,错误也只能在运行时给出,这是不合适的).