gpt4 book ai didi

C++预处理器基于参数的条件扩展

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:15:15 24 4
gpt4 key购买 nike

我有一个正在为我构建类的宏。如果类本身没有将 int 指定为其类型,我想提供一个采用 int 的构造函数。宏看起来像这样:

CLASS_DECLARE(NAME, TYPE)\
class NAME { \
public: NAME(const TYPE& x) : value(x) {}\
private: TYPE value; };

我可以使用 boost 预处理器来手动打开和关闭此构造函数...

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”宏来尝试进一步扩展。不过,我认为这不是问题所在。)想法?

最佳答案

如果其他人有他们想要这种类型的特化的问题,我想发布一个答案。如果您有一组有限的类型/字符串要比较并在编译时了解它们,则此解决方案将起作用。下面是支持 int 和 uint8_t 的例子。特殊构造函数只会为非int类型编写。

#include <boost/preprocessor.hpp>

#define TYPE_IS_int 0
#define TYPE_IS_uint8_t 1

#define CLASS_DECLARE(NAME, TYPE)\
class NAME {\
public: NAME(const TYPE& x) : value(x) {}\
BOOST_PP_EXPR_IF(BOOST_PP_CAT(TYPE_IS_, BOOST_PP_EXPAND(TYPE)), NAME(const int& x) : value(static_cast<TYPE>(x)) {})\
private: TYPE value; };

CLASS_DECLARE(MyIntType, int);
CLASS_DECLARE(MyUint8Type, uint8_t);

宏扩展为:

class MyIntType
{
public:
MyIntType(const int& x) : value(x) {}
private:
int value;
};

class MyUint8Type
{
public:
MyUint8Type(const uint8_t& x) : value(x) {}
MyUint8Type(const int& x) : value(static_cast<uint8_t>(x)) {}
private:
uint8_t value;
};

关于C++预处理器基于参数的条件扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34454345/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com