C++ `typedef不是这个';不需要

C++ `typedef不是这个';不需要,c++,c++11,typedef,C++,C++11,Typedef,基本上,我需要知道当前的类,这样我就可以制作宏来执行以下操作: typedef boost::shared_ptr<MyClass> sptr; typedef boost::shared_ptr<const MyClass> csptr; //etc typedef decltype(*this) this_type; 但它们当然不起作用。没有什么可以让我解决这个问题的吗?我希望C++11能给我们提供一些东西来拼凑一个方法。有两件事:我不会因为重复类型而大惊小怪,我

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

typedef boost::shared_ptr<MyClass> sptr;
typedef boost::shared_ptr<const MyClass> csptr;
//etc
typedef decltype(*this) this_type;

但它们当然不起作用。没有什么可以让我解决这个问题的吗?我希望C++11能给我们提供一些东西来拼凑一个方法。

有两件事:我不会因为重复类型而大惊小怪,我也不会使用宏。您可以使用CRTP:

template <typename T>
struct sp_typedefs {
    typedef std::shared_ptr<T> sptr;         // [*]
    typedef std::shared_ptr<const T> csptr;
};
模板
结构sp_typedefs{
typedef std::shared_ptr sptr;//[*]
typedef std::shared_ptr csptr;
};
然后在每个类型中,使用继承将typedef引入到您的类型中:

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


[*]既然您已经将问题标记为C++11,那么您应该使用标准的
std::shared_ptr
,而不是
boost::shared_ptr
两件事:我不会因为重复类型而大惊小怪,我也不会使用宏。您可以使用CRTP:

template <typename T>
struct sp_typedefs {
    typedef std::shared_ptr<T> sptr;         // [*]
    typedef std::shared_ptr<const T> csptr;
};
模板
结构sp_typedefs{
typedef std::shared_ptr sptr;//[*]
typedef std::shared_ptr csptr;
};
然后在每个类型中,使用继承将typedef引入到您的类型中:

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


[*]既然您已经将问题标记为C++11,那么您应该使用标准的
std::shared_ptr
,而不是
boost::shared_ptr

什么是“当前类”?你想把这个放在哪里?“不必把MyClass作为宏的参数”——宏?什么宏?为什么要使用宏?只要说出类型就行了,没那么难。不要用预处理器来偷懒,应该尽可能避免,它是什么“当前类”?你想把这个放在哪里?“不必把MyClass作为宏的参数”——宏?什么宏?为什么要使用宏?只要说出类型就行了,没那么难。不要用预处理器来偷懒,可能的话应该避免,因为他没有说他在做什么,所以我不知道回答这个模糊的问题是否合适。@SethCarnegie:这个问题可能没有说清楚,但我相信可以从上下文中推断出来。他想将typedef添加到似乎是封闭类型的共享指针中(考虑到他正试图使用
decltype(*this)
)。因为该表达式不起作用,所以该声明不能在成员函数中(在该函数中起作用),所以我猜他想在类定义中创建typedef。我可能错了:)是的,但我认为他在用宏或其他东西定义类,不能使用类名,否则他会这么做。@SethCarnegie:他不能或不想这样做。即使类是用宏定义的,也可以重复名称:
#define CREATE_class(name)class name:public crtp{…
请注意,名称必须在定义中使用,因此它的使用方式与
结构
关键字后的使用方式相同,并且与在此处输入的方式相同,可以在几句话后输入:)是的,但希望他足够聪明,已经注意到了这一点,问题就在别处。他没有说他在做什么,所以我不知道回答这个模糊的问题是否合适。@SethCarnegie:这个问题可能没有明确说明,但我相信可以从上下文中推断出来。他想将typedef添加到共享指针中,指向似乎是封闭类型的对象(考虑到他正试图使用
decltype(*这个)
)。由于该表达式不起作用,因此该声明不能在成员函数中(在该函数中起作用),所以我猜他想在类定义中创建typedef。虽然我可能错了:)是的,但我认为他是用宏或其他东西来定义类,不能使用类名,否则他会这么做。@SethCarnegie:他不能或不想这样做。即使用宏定义类,你也可以重复名称:
#定义创建类(名称)类名:公共crtp{…
请注意,名称必须在定义中使用,因此它的使用方式与
结构
关键字后使用的方式相同,并且与在此处输入的方式相同,可以在几句话后输入:)是的,但希望他足够聪明,已经注意到了这一点,问题还存在于其他地方。