Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 不带typedef的可变扩展器_C++_Templates_C++11_Variadic Templates - Fatal编程技术网

C++ 不带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

执行可变参数扩展时经常使用的一个技巧是将未调整大小的数组typedef与逗号运算符结合使用,如下所示:

#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();
}