C++ 命名空间中的私有类
我在头文件的命名空间中有一个类。该类需要一个模板类型,我只希望使用某些类型。下面是一个例子 文件a.hppC++ 命名空间中的私有类,c++,class,namespaces,typedef,private,C++,Class,Namespaces,Typedef,Private,我在头文件的命名空间中有一个类。该类需要一个模板类型,我只希望使用某些类型。下面是一个例子 文件a.hpp // a.hpp namespace a_ns { template<class T> class a { // stuff }; typedef a<double> a_double; } // end of namespace // stuff //a.hpp 名称空间a\n{ 模板 甲级{ //东西 }; 键入def a_double; }/
// a.hpp
namespace a_ns {
template<class T>
class a {
// stuff
};
typedef a<double> a_double;
} // end of namespace
// stuff
//a.hpp
名称空间a\n{
模板
甲级{
//东西
};
键入def a_double;
}//名称空间的结尾
//东西
文件b.hpp
// b.hpp
#include <a.hpp>
namespace b_ns {
typedef a_ns::a_double b;
}
//b.hpp
#包括
名称空间b_ns{
typedef a_ns::a_double b;
}
文件main.cpp
// main.cpp
#include "b.hpp"
int main() {
b_ns::b my_b; // <<<--- I LIKE this!
a_ns::a<float> my_a_which_is_not_allowed; // <<<--- I DO NOT LIKE THIS THOUGH! D:
}
//main.cpp
#包括“b.hpp”
int main(){
b_ns::b my_b;//以下是如何使用静态断言
#include <type_traits>
template <typename T>
class X
{
T i;
static_assert(!std::is_same<float,T>::value,"Don't use floating point");
};
int main()
{
X<int> a;
//X<float> b; fails at compile time
return 0;
}
#包括
模板
X类
{
TⅠ;
静态断言(!std::is_same::value,“不使用浮点”);
};
int main()
{
xA;
//xb;在编译时失败
返回0;
}
只要变量不是常量或volatile,这将起作用。如果您只想使用类型别名,而不想直接使用a
,则可以将其放入用户应该知道不使用的实现命名空间中:
namespace a_ns {
namespace detail {
template<class T>
class a {
// stuff
};
}
typedef detail::a<double> a_double;
} // end of namespace
名称空间a\n{
名称空间详细信息{
模板
甲级{
//东西
};
}
typedef detail::a_double;
}//名称空间的结尾
现在任何东西都可以使用a_double
,但是要直接使用a
,您的详细信息
名称空间将不得不被挖掘,这通常被认为是一件坏事。如果用户决定这样做,他们已经放弃了避免麻烦,您不应该采取额外措施来阻止他们受伤自我毁灭。事实上,我喜欢这一点——我担心没有办法打败自找麻烦的程序员。@DieterLücking,一旦你忘记了他们必须故意把自己挖到洞里的事实,你就开始不再担心如何阻止它了。如果他们想自找麻烦,就让他们去吧。如果那里有什么东西真的可以帮助他们,至少现在他们不需要黑客来达到目的。或者正如赫伯·萨特所说:防御墨菲,而不是马基雅维利嗯,是的,我很喜欢这样。这并不完全是无懈可击的,但正如你所说的“如果他们故意搞砸自己……”我想这是一个不错的解决方案(+1)@EdwardBird它在所有的Boost库中都被使用。一旦你转到模板库,就真的无法阻止用户获取源代码并定义他们想要的任何东西。