我正在尝试以下代码,无论它是否有效。是否可以以任何其他方式完成,需要帮助。
// FOO.hpp
namespace traits {
class FOO {
public:
typedef std::vector<int> vec_t;
typedef std::map <int, int> map_t;
};
};
namespace my_traits = traits::FOO;
//I know the compile will give the error as "FOO" is not a namespace-name.
// in BAR.hpp
using namespace my_traits;
class BAR {
private:
vec_t my_vector; // my_traits will have FOO's members (typedefs)
map_t my_map; // my_traits will have FOO's members (typedefs)
};
I **don't** want to do the following :
using namespace traits;
class BAR {
private:
traits::FOO::vec_t my_vector // AVOID
traits::FOO::map_t my_map // AVOID
}
但基本上我想将所有typedef放在FOO类中,然后使用FOO作为命名空间。我不想将typdef放在任何名称空间中。
在C ++ 11(或通常的C ++)中是否可行。
谢谢
答案 0 :(得分:0)
您不能将class
用作namespace
,您必须使用真实namespace
:
namespace traits {
namespace FOO {
typedef std::vector<int> vec_t;
typedef std::map <int, int> map_t;
};
};
namespace my_traits = traits::FOO;
using namespace my_traits;
class BAR {
private:
vec_t my_vector; // my_traits will have FOO's members (typedefs)
map_t my_map; // my_traits will have FOO's members (typedefs)
};
答案 1 :(得分:0)
尝试适应你在Remy的解决方案下面的评论中所描述的内容:
如果BAR
不是类模板,则您有以下选项:
namespace traits
{
template<typename T>
struct FOO
{
using vec_t = std::vector<T>;
using map_t = std::map<int, T>;
};
};
// in BAR.hpp
class BAR : traits::FOO<int>
{
vec_t my_vector;
map_t my_map;
};
因此,通过继承具体类BAR
,类型别名在FOO<int>
中可用,其中FOO
是您请求的类模板。这很方便。
但是,如果BAR
是类模板本身就像
template<typename F>
class BAR : F { ... }
(例如某些F
的{{1}}为FOO<T>
),以上内容不太适用:您必须声明
T
为您要使用的using vec_t = typename F::vec_t;
using map_t = typename F::map_t;
的每个别名。但是,即使你没有制作这些别名,你仍然可以说
F
这不是太糟糕。