【问题标题】:`typedef T this_type` that doesn't require T不需要 T 的`typedef T this_type`
【发布时间】:2012-10-20 01:31:47
【问题描述】:

基本上,我需要知道当前的类,这样我才能制作执行以下操作的宏:

typedef boost::shared_ptr<MyClass> sptr;
typedef boost::shared_ptr<const MyClass> csptr;
//etc

无需将 MyClass 作为参数放入宏。我尝试过各种荒谬的事情,例如:

typedef decltype(*this) this_type;

但它们当然不起作用。没有什么可以让我解决这个问题吗?我希望 C++11 能给我们一些东西,让我们一起破解。

【问题讨论】:

  • 什么是“当前班级”?你想把这个放在哪里?
  • "无需将 MyClass 作为宏的参数" -- 宏?什么宏?你为什么使用宏?只需命名类型,这并不难。不要用预处理器偷懒,应该尽量避免,是evil

标签: c++ c++11 typedef


【解决方案1】:

两件事:我不会因为必须重复类型而大惊小怪,而且我根本不会使用宏。您可以使用 CRTP:

template <typename T>
struct sp_typedefs {
    typedef std::shared_ptr<T> sptr;         // [*]
    typedef std::shared_ptr<const T> csptr;
};

然后在每种类型中使用继承将 typedef 带入您的类型:

class MyType : sp_typedefs<MyType>
{
   // ...
};

[*] 由于您已将问题标记为 C++11,因此您应该使用标准的 std::shared_ptr,而不是 boost::shared_ptr

【讨论】:

  • 他没有说他在做什么,所以我不知道尝试回答这个模糊的问题是否合适。
  • @SethCarnegie:这个问题可能没有说清楚,但我相信可以从上下文中推断出来。他想将 typedef 添加到似乎是封闭类型的共享指针中(考虑到他正在尝试使用decltype(*this))。因为该表达式不起作用,所以这个声明不能在成员函数内(它可以工作),所以我的猜测是他想在类定义中创建 typedef。不过我可能是错的:)
  • 是的,但我认为他正在使用宏或其他东西进行类定义并且不能使用类名,否则他会这样做。
  • @SethCarnegie:他不能或不想。即使类是用宏定义的,您也可以重复名称:#define CREATE_CLASS(name) class name : public crtp&lt;name&gt; { ... 请注意,name 必须在定义中使用,因此与在 class 之后使用的方式相同或struct 关键字,并且与在此处输入的方式相同,可以稍后输入几个单词:)
  • 是的,但希望他足够聪明,已经注意到了这一点,而问题出在其他地方。
猜你喜欢
  • 1970-01-01
  • 2015-04-15
  • 2011-10-31
  • 2021-02-23
  • 2014-11-17
  • 2010-11-09
  • 1970-01-01
  • 1970-01-01
  • 2016-07-27
相关资源
最近更新 更多