C++模板化typedef

5
我有一个模板类
template <T>
class Example 
{
...
};

这个区域有许多以下类型的方法:

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

在这些代码中,我使用tr1::shared_ptr来处理U、V或T。

每次输入tr1::shared_ptr<const U>tr1::shared_ptr<const V>都很繁琐。

显然,可以这样做:

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

无法正常工作。

在这种情况下,你该怎么办?有什么方法可以减少冗余?


1
重复问题:https://dev59.com/3kbRa4cB1Zd3GeqP15uX,https://dev59.com/q3M_5IYBdhLWcg3wNwQv,https://dev59.com/E3RB5IYBdhLWcg3wtJKF - Éric Malenfant
我不确定它们是否是重复的,它们肯定是相关的,可能值得浏览一下答案,但是完全重复吗? - David Rodríguez - dribeas
3个回答

9
您可以使用内部类型:
template <typename U>
struct sptr {
    typedef tr1::shared_ptr<U> t;
};

然后说 sptr<U>::t,或者不幸地经常是 typename sptr<U>::t

C++0x有模板typedefs,您可以检查您的编译器是否可以被说服接受它们:

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

然后说sptr<U>

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


在不需要使用 typename 的情况下,它确实有一定作用。但是,对于像 tr1::shared_ptr<U> 这样短的内容来说,它并不是很好用。如果是 std::vector<shared_ptr<U> >::const_iterator 需要缩写的话,那么我们可能可以考虑使用它 :-) - Steve Jessop

2

除了roe所说的内容外,没有什么可以减少冗余的。

但是关于问题本身有一篇不错的文章:模板typedef

如果您有一些通用函数,它期望您的类型具有某些相关的typedef,并且您的类型是模板化的(考虑您必须提供result_t并且它应该是您的模板参数!),那么您确实需要这个技巧。


1
using tr1::shared_ptr;

应该允许您使用shared_ptr而无需前缀,但这就是我所知道的全部。抱歉。


1
由于我的模板定义和声明必须在头文件中,这难道不会违反一个规则吗?即头文件中不应该有using声明吗? - user231536
@user231536:我不明白为什么一定要放在头文件里,你可以把它放在源文件中。虽然需要在所有源文件中都这样做,但仍然可以减少混乱。 - falstro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接