Macro overloading
Macro overloading
本文关键字:overloading Macro 更新时间:2023-10-16
有可能定义这样的东西吗:
#define FOO(x, y) BAR()
#define FOO(x, sth, y) BAR(sth)
这样:
FOO("daf", sfdas);
FOO("fdsfs", something, 5);
翻译为:
BAR();
BAR(something);
编辑:实际上,BAR
的是我类的方法。很抱歉之前没有这么说(我觉得这不相关(。
回答DyP的问题:
class Testy
{
public:
void TestFunction(std::string one, std::string two, std::string three)
{
std::cout << one << two << three;
}
void AnotherOne(std::string one)
{
std::cout << one;
}
void AnotherOne(void)
{
std::cout << "";
}
};
#define PP_NARG(...) PP_NARG_(__VA_ARGS__,PP_RSEQ_N())
#define PP_NARG_(...) PP_ARG_N(__VA_ARGS__)
#define PP_ARG_N(_1, _2, _3, N, ...) N
#define PP_RSEQ_N() 3, 2, 1, 0
// macro for exactly 2 arguments
#define FOO_2(_1, _2) AnotherOne()
// macro for exactly 3 arguments
#define FOO_3(_1, _2, _3) AnotherOne(_2)
// macro selection by number of arguments
#define FOO_(N) FOO_##N
#define FOO_EVAL(N) FOO_(N)
#define TestFunction(...) FOO_EVAL(PP_NARG(__VA_ARGS__))(__VA_ARGS__)
然后呼叫:
Testy testy;
testy.TestFunction("one", "two", "three"); // line 9
编译器输出:
警告1警告C4003:宏"PP_ARG_N"main.cpp 9 的实际参数不足
警告2警告C4003:宏'FOO_'main.cpp 9 的实际参数不足
错误3错误C2039:"FOO_":不是"Testy"main.cpp 9 的成员
编辑----------------------------------------------------------------查看此处--------------------------------------------------------------->
(在参数数量上重载宏(
// functions, or macros, ....
void bar(){}
void bar(int){}
#define EXPAND(X) X // for MSVC10 compatibility
// compute number of (variadic) macro arguments
// from http://groups.google.com/group/comp.std.c/browse_thread/thread/77ee8c8f92e4a3fb/346fc464319b1ee5?pli=1
#define PP_NARG(...) EXPAND( PP_NARG_(__VA_ARGS__, PP_RSEQ_N()) )
#define PP_NARG_(...) EXPAND( PP_ARG_N(__VA_ARGS__) )
#define PP_ARG_N(_1, _2, _3, N, ...) N
#define PP_RSEQ_N() 3, 2, 1, 0
// macro for exactly 2 arguments
#define FOO_2(_1, _2) bar()
// macro for exactly 3 arguments
#define FOO_3(_1, _2, _3) bar(_2)
// macro selection by number of arguments
#define FOO_(N) FOO_##N
#define FOO_EVAL(N) FOO_(N)
#define FOO(...) EXPAND( FOO_EVAL(EXPAND( PP_NARG(__VA_ARGS__) ))(__VA_ARGS__) )
int main()
{
int something = 42;
FOO("daf", sfdas);
FOO("fdsfs", something, 5);
}
预处理器输出:
void bar(){}
void bar(int){}
int main()
{
int something = 42;
bar();
bar(something);
}
版本2:似乎VS2010在__VA_ARGS__
和宏替换方面存在一些问题。
更新:这是。。。虫子??(另请参阅此SO问题(:
#define MACRO2(PARAM0, PARAM1, ...) arg 0: >PARAM0< arg 1: >PARAM1<
additional args: >__VA_ARGS__<
#define MACRO1(...) MACRO2(__VA_ARGS__, OTHERARG_0, OTHERARG_1)
MACRO1(ARG0, ARG1);
预处理器输出:
arg 0: >ARG0, ARG1< arg 1: >OTHERARG_0< additional args: >OTHERARG_1<;
有关解决方法,请参阅链接的SO问题。我已经更新了上面的原始答案(代码(,并用MSVC10->进行了测试。
相关文章:
- Overloading C++
- LPWSTR typedef and macro?
- C++ Overloading Macros
- 通过Overloading Operator []访问自定义数组包装器中的元素
- Overloading new
- 如何修复MSVC++(Microsoft Visual studio)中"macro overloading"的可变参数宏相关问题?
- 从输入文件中读取c ,具有iStream Operator Overloading
- CALLBACK macro (QT)
- Specific C++ Macro
- overloading [] and , c++11
- QT Macro q_slots'''类访问限制之后
- 如何在Macro BranchCallback中固定界限/更改变量界限?C
- 错误C2244无法将函数定义与CPP // Operator Overloading中的现有声明匹配
- Qt with Visual Studio macro issue
- Replacing __LINE__ macro
- Overloading STD :: Whow()无法转换const char*
- Overloading Iostream C++
- how to #define c++ STL macro
- Overloading a macro
- Macro overloading