是否可以在 C++ 中创建变量,每次使用不同的值后都会扩展该变量?
例如,我想要以下
#define mytype [smth here]
void foo(mytype a,mytype b,mytype c)
将扩展为
void foo(mytype1 a,mytype2 b,mytype3 c)
或者
void foo(mytype1 a,mytype11 b,mytype111 c)
是否可以在 C++ 中创建变量,每次使用不同的值后都会扩展该变量?
例如,我想要以下
#define mytype [smth here]
void foo(mytype a,mytype b,mytype c)
将扩展为
void foo(mytype1 a,mytype2 b,mytype3 c)
或者
void foo(mytype1 a,mytype11 b,mytype111 c)
下面是一个使用Boost.Preprocessor实现函数参数的例子:
#include <boost/preprocessor/repetition/enum_binary_params.hpp>
void foo(BOOST_PP_ENUM_BINARY_PARAMS(3, mytype, p));
这将扩展到
void foo(mytype0 p0, mytype1 p1, mytype2 p2);
你不能有一个宏来改变它扩展的内容,但你可以让它扩展的东西意味着不同的东西:
std::string foo()
{
static int x;
return std::string("myvar") + std::to_string(x++) + "\n";
}
#define myvar foo()
和
cout<<myvar;
cout<<myvar;
将打印出来
myvar1
myvar2
如果它应该只在输出时增加,您可以定义一个覆盖 的结构operator<<
,例如:
struct myvarstruct {
int i;
myvarstruct() : i(1){}
} myvar;
ostream &operator << (ostream &o, myvarstruct &s) {
return o << "myvar" << s.i++;
}
#define mytype [smth here]
#define TYPE(a, b) _TYPE(a, b)
#define _TYPE(a, b) a##b
void foo(TYPE(mytype, 1) a, TYPE(mytype, 2) b, TYPE(mytype, 3) c)