如何防止C++模板的专业化?

nav*_*nav 17 c++ templates namespaces c++11

当我这样做时,编译器不会抱怨;-)

// Myfile.h
#include <iostream>
#include <vector>

namespace std
{

template<> class vector<int>
{
public:
    vector ()
    {
        std::cout << "Happy Halloween !!!\n";
    }
};

}
Run Code Online (Sandbox Code Playgroud)

有没有办法防止类/函数模板的这种不合需要的专业化?

- 编辑 -

我只是用std ::作为例子.我正在寻找的是一种防止这种情况发生在任何模板类中的方法.

seh*_*ehe 12

您所做的是在标准命名空间内专门化标准库类型.

除了一些记录的定制点(std :: swap,std :: hash <>)或用户定义类型的特定约束特化(例如MySmartPtr<T>)之外,这违反了规范,结果是未定义的行为.


编辑:此类规则违规没有强制诊断.

为了让你的图书馆的客户更加困难,你可以做到这一点:

namespace Public {


    namespace Hidden { // DON'T TOUCH THESE!
        template <typename> struct MyType { };
    }

    using Hidden::MyType;

}
Run Code Online (Sandbox Code Playgroud)

现在,尝试专注MyType<>于命名空间Hidden将失败.

  • @nav添加了一个让它变得更难的想法.你不能***["保护免受Machiavelli"](http://www.gotw.ca/gotw/076.htm)***虽然(松散地引用Herb Sutter) (3认同)

Mar*_*k B 8

不,C++语言没有提供一种通用机制,您可以通过该机制说"不允许对此模板进行特化".

但这可能无关紧要.对于您的代码已经使用的任何实例化,提供专业化的用户将违反一个定义规则,并且他们的程序可能会在火球中爆炸.

如果您没有在库中使用实例化,那么它们的作用并不重要.

这是在C++中你无法阻止你的用户自己在脚下拍摄的情况之一,如果他们选择这样做,则责任就在他们身上.


Jan*_*ann 5

一个别名模板不能专业化,有您需要的类模板的行为.

template<class T>
struct my_class_implementation_which_should_not_be_used_directly
{
    // impl
};


template<class T>
using my_class = my_class_implementation_which_should_not_be_used_directly<T>;
Run Code Online (Sandbox Code Playgroud)

此外,您应该记录my_class_implementation_which_should_not_be_used_directly未定义行为的特殊结果.现在你的图书馆用户不能my_class意外地专攻,并且直接用丑陋的名字警告这个类.