Обратитесь к классу в макросе C ++

Я хочу написать

struct Foo{
MY_MACRO
};

и это расширится в

struct Foo{
void bar(Foo&){}
};

Как мне определить MY_MACRO?

Единственное, что я могу придумать, это следующее:

#define MY_MARCO(X) void bar(X&){}
struct Foo{
MY_MACRO(Foo)
};

Это очень близко, но не совсем идеально, так как я не хочу повторять название класса.

К сожалению, следующее не компилируется:

struct Foo{
void bar(decltype(*this)&){}
};

3

Решение

Это тесно связано этот вопрос. Ответ заключается в том, что вы не можете (пока) написать что-то, использующее тип определения класса, в котором вы находитесь. Вам нужно будет написать макрос, который включает начало определения класса (т.е. struct Foo) и некоторый механизм для облегчения typedef.

1

Другие решения

Но вы можете использовать decltype(*this) в static_assert. т.е .:

#include <type_traits>

struct Foo {
template <typename T>
void bar(T& t) {
static_assert(std::is_same<T&, decltype(*this)>::value,
"bar() only accepts objects of same type");
}
};
1

По вопросам рекламы [email protected]