Я хочу написать
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)&){}
};
Это тесно связано этот вопрос. Ответ заключается в том, что вы не можете (пока) написать что-то, использующее тип определения класса, в котором вы находитесь. Вам нужно будет написать макрос, который включает начало определения класса (т.е. struct Foo)
и некоторый механизм для облегчения typedef.
Но вы можете использовать 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");
}
};