Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使宏处理不同类型的参数?_C++ - Fatal编程技术网

C++ 如何使宏处理不同类型的参数?

C++ 如何使宏处理不同类型的参数?,c++,C++,如何编写一个宏,根据其参数类型执行不同的操作? 我有一个宏需要处理一个参数,该参数可以有两种类型之一 #include <typeinfo> enum class Coolness { kUndefined, kUncool, kCool }; enum class Tallness { kUndefined, kShort, kTall }; void MakePerson (Coolness coolness, Tallness tallness) {} // Provid

如何编写一个宏,根据其参数类型执行不同的操作?

我有一个宏需要处理一个参数,该参数可以有两种类型之一

#include <typeinfo>

enum class Coolness { kUndefined, kUncool, kCool };
enum class Tallness { kUndefined, kShort, kTall };

void MakePerson (Coolness coolness, Tallness tallness) {}

// Provide a way to make a person by only providing Coolness or Tallness.
#define MAKE_PERSON(x)                         \
({                                             \
  if (typeid(x) == typeid(Coolness)) {         \
      MakePerson(((x)), Tallness::kUndefined); \
  } else {                                     \
      MakePerson(Coolness::kUndefined, (x));   \
  }                                            \
})

int main()
{
  MAKE_PERSON(Coolness::kUncool);
  MAKE_PERSON(Tallness::kTall);
}
(完成日期)

我们不能像中那样使用
\u内置类型\u兼容\u p
,因为我们的编译器没有这样的功能


如何编写一个宏,根据其参数的类型执行不同的操作?

欢迎其他建议,但我们最终使用静态转换告诉编译器参数的类型:

#include <typeinfo>

enum class Coolness { kUndefined, kUncool, kCool };
enum class Tallness { kUndefined, kShort, kTall };

void MakePerson (Coolness coolness, Tallness tallness) {}

// Provide a way to make a person by only providing Coolness or Tallness.
// Static cast is used because the compiler fails to typecheck the 
// branches correctly without it.
#define MAKE_PERSON(x)                                              \
({                                                                  \
  if (typeid(x) == typeid(Coolness)) {                              \
      MakePerson(static_cast<Coolness>((x)), Tallness::kUndefined); \
  } else {                                                          \
      MakePerson(Coolness::kUndefined, static_cast<Tallness>((x))); \
  }                                                                 \
})

int main()
{
  MAKE_PERSON(Coolness::kUncool);
  MAKE_PERSON(Tallness::kTall);
}

使用简单的函数重载,不要试图使宏比需要的更智能:

enum class Coolness { kUndefined, kUncool, kCool };
enum class Tallness { kUndefined, kShort, kTall };

void MakePerson (Coolness coolness, Tallness tallness)
{
    ...
}

inline void MakePerson (Coolness coolness)
{
    MakePerson(coolness, Tallness::kUndefined);
}

inline void MakePerson (Tallness tallness)
{
    MakePerson(Coolness::kUndefined, tallness);
}

#define MAKE_PERSON(x) \
{ \
    // use __FILE__ and __LINE__ as needed... \
    MakePerson(x); \
}

int main()
{
    MAKE_PERSON(Coolness::kUncool);
    MAKE_PERSON(Tallness::kTall);
}

这是C++模板所用的。这是C++,而不是史前的C,带有颤抖的宏…不幸的是,我认为我需要在现实世界问题中使用宏——我在日志基础结构上工作,需要访问<代码>这只是我能想到的最小的例子。因为
\uuuu LINE\uuuuu
\uuuu FILE\uuuuu
总是相同的类型,在任何地方,都不清楚这与任何事情有什么关系。@SamVarshavchik,我想说的是我正在启用日志(…)调用,我想我需要在这里使用一个宏,这样我就可以得到调用发生的行和文件(否则我只会得到log-cal实现的行和文件)。但我想你是说宏的实现应该使用C++模板,而不是永远不使用宏吗?这太可怕了。还不清楚为什么你做代码> STATICEXCAST 当你刚刚检查过的类型是“代码>酷> <代码>。如果你的问题与<代码的错误分支>如果< /代码>不打字,请考虑<代码> COSTEXPR如果,而不是用无效的CasePrimy隐藏类型错误。@我不知道
constexpr if
。不幸的是,我不能使用它,因为我仅限于C++11。@m.m添加了一条注释来解释我为什么进行静态_转换,谢谢(不是说这会使它更好,但希望它能帮助解释原因)。谢谢,这显然是解决我给出的示例的方法。我认为它说明了我需要如何重新编写实际代码,以便我们能够更接近这个实现。。。
...Program finished with exit code 0 
enum class Coolness { kUndefined, kUncool, kCool };
enum class Tallness { kUndefined, kShort, kTall };

void MakePerson (Coolness coolness, Tallness tallness)
{
    ...
}

inline void MakePerson (Coolness coolness)
{
    MakePerson(coolness, Tallness::kUndefined);
}

inline void MakePerson (Tallness tallness)
{
    MakePerson(Coolness::kUndefined, tallness);
}

#define MAKE_PERSON(x) \
{ \
    // use __FILE__ and __LINE__ as needed... \
    MakePerson(x); \
}

int main()
{
    MAKE_PERSON(Coolness::kUncool);
    MAKE_PERSON(Tallness::kTall);
}