我想创建一个C ++宏函数来调试,我希望它能像这样工作:
int main(){
int a = 3, b = 5, c = 7;
string s = "<";
print(a,s,b);
print(a,s,b,s,c);
}
OUTPUT:
3 < 5
3 < 5 < 7
我已经阅读了很多关于可变参数宏的内容,但是我尝试编码的任何东西都根本无法工作。
我考虑过使用lambda但没有提出算法来实现它。
我需要它像1行代码,因为它仅用于调试,而且我可以创建更复杂的函数,但我想这一定是可能的......
答案 0 :(得分:2)
您可以使用可变参数模板而不是MACRO:
template <typename ... Ts>
void print(Ts&&... args)
{
int dummy[] = {0, ((std::cout << args), 0)...};
static_cast<void>(dummy); // avoid warning for unused variable
std::cout << std::endl;
}
或在c ++ 17
template <typename ... Ts>
void print(Ts&&... args)
{
(std::cout << ... << args) << std::endl;
}
答案 1 :(得分:1)
如果您同意用&#39; _context.Entry(customer).State = EntityState.Modified;
_context.Entry(customer.ShippingAddress).State = EntityState.Modified;
&#39;替换分隔符。 (而不是&#39; <<
&#39;)然后宏很容易定义(请注意,,
不是宏的好名称,这就是为什么我适当地重命名):
print
输出:
#include <iostream>
#include <string>
#ifdef DEBUG
#define DEBUG_PRINT(x) std::cout << x << std::endl
#else
#define DEBUG_PRINT(x)
#endif
int main(){
int a = 3, b = 5, c = 7;
std::string s = "<";
std::cout << "START" << std::endl;
DEBUG_PRINT(a << s << b);
DEBUG_PRINT(a << s << b << s << c);
std::cout << "END" << std::endl;
return 0;
}
答案 2 :(得分:1)
我几乎达到了我想要的效果(使用2行代码):
#define print(args...) {db,args; cerr<<endl;}
struct dbg{template<typename T> dbg& operator , (const T& v){cerr<<v<<" "; return *this; }} db;
现在我可以打印(1,2,&#34; asjd&#34;)并且工作正常