У меня есть макрос, который создает для меня класс. Я хочу предоставить конструктор, который принимает int, если сам класс не имеет int, указанного в качестве его типа. Макрос выглядит примерно так:
CLASS_DECLARE(NAME, TYPE)\
class NAME { \
public: NAME(const TYPE& x) : value(x) {}\
private: TYPE value; };
Я могу приблизиться с помощью препроцессора ускорения, чтобы вручную включать и выключать этот конструктор ...
CLASS_DECLARE(NAME, TYPE)\
class NAME { \
public: NAME(const TYPE& x) : value(x) {}\
BOOST_PP_EXPR_IF(0, NAME(const int& x) : value(static_cast<TYPE>(x)) {})\
private: TYPE value; };
Однако я не могу заменить 0 в макросе условным. Я хочу что-то вроде:
CLASS_DECLARE(NAME, TYPE)\
class NAME { \
public: NAME(const TYPE& x) : value(x) {}\
BOOST_PP_EXPR_IF(BOOST_PP_NOT_EQUAL(TYPE, int), NAME(const int& x) : value(static_cast<TYPE>(x)) {})\
private: TYPE value; };
Однако это расширяется до чего-то менее полезного:
BOOST_PP_EXPR_IIF_BOOST_PP_BOOL_BOOST_PP_NOT_EQUAL_CHECK_BOOST_PP_NOT_EQUAL_int(0,
BOOST_PP_NOT_EQUAL_int)(MyType(const int& x) : value(static_cast<int>(x)){};
Оглядываясь вокруг, кажется, что BOOST_PP_NOT_EQUAL не предназначен для такого типа сравнения. (Я знаю о проблемах с расширением макросов и создал несколько макросов «IMPL», чтобы попытаться расширить возможности. Я не думаю, что здесь проблема.) Мысли?