【发布时间】:2021-03-10 15:26:10
【问题描述】:
我的宏中的 decltype(__VA_ARGS__) 仅针对单个参数而不是在传递多个参数时进行编译。
我想要实现的是根据运行时条件调用可变参数函数。 我的打印机的参数计算起来可能很昂贵,因此我不想在我的条件为假时评估这些参数。
下面是一个最小的示例。任何改写这个问题/描述的 cmets 也很感激。
#include <iostream>
#include <utility>
#include <functional>
#define PRINT_IF(printer, cond, ...) if(cond) std::invoke(&Printer::print<decltype(__VA_ARGS__)>, printer, __VA_ARGS__)
// Some Fixed Printer Interface ...
class Printer{
public:
void print(){}
template <typename T, typename... Types>
void print(T&& var1, Types&&... var2)
{
std::cout << var1 << std::endl ;
print(var2...);
}
};
int main()
{
Printer p;
PRINT_IF(p, returns_false(), very_expensive_string()); // compiles and expensive operation skipped
PRINT_IF(p, true, 1); // compiles
PRINT_IF(p, true, 1, 2, 3); // doesn't compile
// The macro should also handle pointers.
PRINT_IF(&p, true, 1, 2, 3);
return 0;
}
【问题讨论】:
-
问题是当你需要
decltype(1), decltype(2), decltype(3)时decltype(__VA_ARGS__)变成decltype(1, 2, 3)。 -
1.你不需要这个 decltype。 2. decltype 是一元的,所以如果你把
__VA_ARGS__放在额外的括号中,它就可以工作。 -
有什么理由使用
std::invoke而不是在printer上调用print? -
为什么要使用宏?我看不出有任何理由在这里使用它。
-
@Holt 处理
printer可以是指针或实例的情况
标签: c++ variadic-templates template-argument-deduction variadic-macros