【问题标题】:Using a template structure as a namespace使用模板结构作为命名空间
【发布时间】:2016-02-18 16:26:33
【问题描述】:

我刚刚完成了我正在编写的库的迭代。 为了隔离某些类型,我最初将它们放入命名空间中。 然后,我意识到这个命名空间实际上应该是模板化的,所以我把它变成了一个结构,即:

namespace A
{
    typedef _foo foo;
}

成为

template <class T>
struct A
{
    typedef _foo<T> foo;
};

这在比如说这种情况下使用起来更方便:

template <class T>
class MyClass
{
public:
    typedef A<T>               nsA;
    typedef typename nsA::foo  foo_type;
};

现在,我在另一个库中使用该库,在那里,我知道模板类型T 永远不会改变。所以我想做类似的事情:

namespace B
{
    using namespace A<double>;
}

但显然,这不起作用。当然,我可以停止偷懒,typedef 手动在A&lt;double&gt; 中定义每个定义,但我喜欢尽可能偷懒。关于如何做与最后一步等效的事情有什么想法吗?

【问题讨论】:

  • 在 c++11 中,您可以为所有模板起别名:namespace A { template &lt;typename T&gt; using foo = _foo&lt;T&gt;; },然后在 MyClass 中:using foo_type = A::foo&lt;T&gt;;(您重复 T,但去掉 typename)。顺便说一句,这并不能解决您的固定参数。

标签: c++ c++11 struct namespaces using


【解决方案1】:

其实,我刚刚找到了答案。对不起,如果你觉得这个问题没用,我会删除它,请在评论中告诉我。

由于我首先使用结构作为命名空间,因此解决方案是继续使用结构作为命名空间(!):

struct B
    : public A<double>
{};

这是demo

【讨论】:

  • 顺便说一句,继承是public,默认是struct,所以你可以简化为struct B : A&lt;double&gt; {};
猜你喜欢
  • 1970-01-01
  • 2021-01-08
  • 2014-11-14
  • 1970-01-01
  • 2014-03-23
  • 2010-11-01
  • 2018-01-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多