C++ 命名空间中的私有类

C++ 命名空间中的私有类,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

// 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库中都被使用。一旦你转到模板库,就真的无法阻止用户获取源代码并定义他们想要的任何东西。