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);
}