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将失败.
不,C++语言没有提供一种通用机制,您可以通过该机制说"不允许对此模板进行特化".
但这可能无关紧要.对于您的代码已经使用的任何实例化,提供专业化的用户将违反一个定义规则,并且他们的程序可能会在火球中爆炸.
如果您没有在库中使用实例化,那么它们的作用并不重要.
这是在C++中你无法阻止你的用户自己在脚下拍摄的情况之一,如果他们选择这样做,则责任就在他们身上.
一个别名模板不能专业化,有您需要的类模板的行为.
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意外地专攻,并且直接用丑陋的名字警告这个类.
| 归档时间: |
|
| 查看次数: |
2997 次 |
| 最近记录: |