【问题标题】:C++ templated typedefC++ 模板化类型定义
【发布时间】:2010-02-10 17:23:45
【问题描述】:

我有一个模板类

template <T>
class Example 
{
...
};

里面有 有以下类型的许多方法:

template <class U> <class V> method(....)

在这些里面我使用 tr1::shared_ptr 到 U 或 V 或 T。

输入 tr1::shared_ptr&lt;const U&gt;tr1::shared_ptr&lt;const V&gt; 很繁琐。

显而易见的事情:

template <typename U>
typedef tr1::shared_ptr<U> shptr<U>;

不工作。

遇到这种情况你会怎么做?有什么可以减少冗长的?

【问题讨论】:

标签: c++ templates typedef


【解决方案1】:

你可以使用内部类型:

template <typename U>
struct sptr {
    typedef tr1::shared_ptr<U> t;
};

然后说sptr&lt;U&gt;::t,或者不幸的是经常说typename sptr&lt;U&gt;::t

C++0x 有模板类型定义,你可以检查你的编译器是否可以被说服接受它们:

template<typename U>
using sptr = tr1::shared_ptr<U>;

然后说sptr&lt;U&gt;

当然,#define sptr ::tr1::shared_ptr 总是存在的,例如,如果您期待未来的 C++0x 并希望弥合差距。或者,如果您在足够狭窄的上下文中使用它,宏并不可怕。

【讨论】:

  • 嗯,它在你不需要typename 的情况下有点作用。否则,不,这对于像 tr1::shared_ptr&lt;U&gt; 这样短的东西来说不是很好。如果需要缩写的是std::vector&lt;shared_ptr&lt;U&gt; &gt;::const_iterator,那么我们可能会做生意:-)
【解决方案2】:

没有什么可以减少冗长(除了 roe 所说的)。

但是关于问题本身的好文章:Template Typedef

如果你有一些泛型函数期望你的类型有一些关联的 typedef,并且你的类型是模板化的,那么你真的需要这个技巧(考虑你已经提供result_t,它应该是你的模板参数!)。

【讨论】:

    【解决方案3】:
    using tr1::shared_ptr;
    

    应该允许您使用不带前缀的shared_ptr,但这就是我所知道的。对不起。

    【讨论】:

    • 由于我的模板定义和声明必须在头文件中,这是否违反了头文件中不应有 using 声明的规则?
    • @user231536:我不明白为什么它必须放在头文件中,你可以把它放在你的源文件中吗?它必须在所有源文件中完成,但仍会减少混乱。
    猜你喜欢
    • 1970-01-01
    • 2019-06-09
    • 2011-02-17
    • 1970-01-01
    • 2011-11-30
    • 2012-02-04
    相关资源
    最近更新 更多