将可变参数包强制转换为 (void)
Casting a variadic parameter pack to (void)
>我实际上遇到了以下问题:我希望能够使用 -Wall -Wextra -Werror
构建,但是,以下代码会抱怨未使用的参数:
struct foo
{
template <typename... Args>
static void bar()
{ }
template <typename T, typename ... Args>
static void bar(T&& value, Args&& ... args)
{
#ifdef DEBUG
std::cout << value;
bar(std::forward<Args>(args)...);
#endif
}
};
第一个未使用的参数很容易修复:
#ifdef DEBUG
std::cout << value;
bar(std::forward<Args>(args)...);
#else // Shut the compiler up
(void) value;
#endif
我的问题是,我该如何处理剩余的args
?也不
(void)(args...);
也不
(void)(args)...;
将起作用,两者都抱怨参数包没有扩展。
(这是在GCC 4.7.3下,如果这将对潜在的解决方案产生任何影响)。
使用可变参数模板时,使用 sink 更干净:
struct sink { template<typename ...Args> sink(Args const & ... ) {} };
#ifdef DEBUG
std::cout << value;
bar(std::forward<Args>(args)...);
#else
sink { value, args ... }; //eat all unused arguments!
#endif
你真的可以在这里使用条件命名。
#ifdef DEBUG
#define DEBUG_NAME(x) x
#else
#define DEBUG_NAME(x)
#endif
static void bar(T&& DEBUG_NAME(value), Args&& DEBUG_NAME(args)) {}
解决此问题
的另一种方法是移动 #define 以创建一个省略参数名称的替代模板:
#ifdef DEBUG
template <typename T, typename ... Args>
static void bar(T&& value, Args&& ... args)
{
std::cout << value;
bar(std::forward<Args>(args)...);
}
#else
template <typename T, typename ... Args>
static void bar(T&& value, Args&& ...)
{
}
#endif
相关文章:
- Boost buffer_cast 无法从 void* 转换为 PointerToPodType
- 将void*转换为某种类型的shared_ptr
- 如何将 void* 转换为函数指针?
- 对 C++ 中的特定标头使用 extern C 关键字是否允许从 void* 转换为 char*?
- 如何将 void 转换为 typedef void(..)(浮动)
- 无法将参数 1 从"int (__thiscall A::* *)(void)"转换为"int (__cdecl *)(void)"
- 从 'void *' 转换为 'const std::string *&' 必须具有所有中间指针 const 合格
- x = malloc(n * sizeof (int));无法将 void 转换为 int
- 错误:请求从“ void”转换为“ QString”的非量表类型
- 使用 LLVM 从 const void * 转换为模板类型时出现问题
- 如何修复错误:请求从"void"转换为非标量类型"std::vector<int>"
- void* 转换为基类并调用虚函数
- 将 void* 转换为 std::function<void()>
- 无法将参数 4 从 'void' 转换为'const char *'
- C++11 无法将 std::condition_variable::wait 从 'void' 转换为 'bool'
- 如何在 C++11 中将"const void*"转换为函数指针?
- 似乎无法在 c++ 中将 void* 转换为结构
- 将 void 转换为字节
- void * 转换为 int 语法的问题
- C++从类型“void*”转换为类型“double”无效