C++ 不带typedef的可变扩展器
执行可变参数扩展时经常使用的一个技巧是将未调整大小的数组typedef与逗号运算符结合使用,如下所示:C++ 不带typedef的可变扩展器,c++,templates,c++11,variadic-templates,C++,Templates,C++11,Variadic Templates,执行可变参数扩展时经常使用的一个技巧是将未调整大小的数组typedef与逗号运算符结合使用,如下所示: #include <iostream> template<typename... Ts> void expander(Ts&&... ts) { using expand = int[]; (void)expand{0, (std::forward<Ts>(ts)(), 0)...}; } void f() { st
#include <iostream>
template<typename... Ts>
void expander(Ts&&... ts)
{
using expand = int[];
(void)expand{0, (std::forward<Ts>(ts)(), 0)...};
}
void f()
{
std::cout << __PRETTY_FUNCTION__ << std::endl;
}
int main()
{
expander(f, f);
}
#包括
模板
空隙扩展器(Ts&…Ts)
{
使用expand=int[];
(void)展开{0,(std::forward(ts)(),0);
}
void f()
{
标准::cout
我们可以在不引入typedef的情况下执行此操作吗
不带typedef,但带变量
template<typename... Ts>
void expander(Ts&&... ts)
{
int dummy[] = {0, (std::forward<Ts>(ts)(), void(), 0)...};
static_cast<void>(dummy); // Avoid warning for unused variable
}
模板
空隙扩展器(Ts&…Ts)
{
int-dummy[]={0,(std::forward(ts)(),void(),0);
static_cast(dummy);//避免对未使用的变量发出警告
}
在C++17中,您可以通过以下方式进行折叠:
template<typename... Ts>
void expander(Ts&&... ts) {
(..., std::forward<Ts>(ts)());
}
模板
空隙扩展器(Ts&…Ts){
(…,std::forward(ts)();
}
在这个表达式中
(void)int[]{0, (std::forward<Ts>(ts)(), 0)...};
您可以按如下方式执行:
#include <iostream>
template<typename... Ts>
void expander(Ts&&... ts)
{
int dummy[sizeof...(Ts)] = {(std::forward<Ts>(ts)(), 0)...};
}
void f()
{
std::cout << __PRETTY_FUNCTION__ << std::endl;
}
int main()
{
expander(f, f, f);
expander();
}
#包括
模板
空隙扩展器(Ts&…Ts)
{
int-dummy[sizeof…(Ts)]={(std::forward(Ts)(,0)…};
}
void f()
{
谢谢,为什么第二个void() <代码> STD::前进/ <代码> @ vSoTCO,因为负责C++程序员使用保护……针对过载逗号运算符:)PrAutoReIn,但不应该<代码>空格 >之前>代码> STD::前进< /COD>?因为函数可以返回一些重载的对象<代码>运算符,(MyType,Valy(&)())
@vsoftco是的,您可以强制转换可调用函数的返回值,也可以执行Jarod所做的操作。void()
不是函数类型,它是类型为void
的表达式,并且不能使用void
重载逗号运算符@IvanKush:以避免警告(在大多数编译器中)对于未使用的变量。如果您真的不喜欢typedef,请使用std::initializer\u list
。实际上,这非常有趣,经过投票表决。为什么我不能只使用int dummy[]={(std::forward(ts)),0)…};
?本例中的代码不可编译。@vsoftco这实际上与Jarod的答案相同,但它不像他的答案那样处理所有情况,并且增加了指定数组大小的不必要的繁琐性。不带参数的调用定义了大小为0的数组,gcc和clang允许将其作为扩展(如果代码编译,ideone将隐藏警告)。如果要正确执行此操作,代码需要int dummy[sizeof…(Ts)+1]={0,(std::forward(Ts)(,0)…};
,但首先不需要数组大小。
template<typename... Ts>
void expander(Ts&&... ts)
{
(void(std::forward<Ts>(ts)()), ...);
}
#include <iostream>
template<typename... Ts>
void expander(Ts&&... ts)
{
int dummy[sizeof...(Ts)] = {(std::forward<Ts>(ts)(), 0)...};
}
void f()
{
std::cout << __PRETTY_FUNCTION__ << std::endl;
}
int main()
{
expander(f, f, f);
expander();
}