如果函数返回类型为void,我该如何调用可变参数包中的所有函数?

odi*_*erd 3 c++ templates metaprogramming variadic-templates c++11

我有一个完整的默认可构造的参数包,然后是可调用的对象(如ExampleFunctor),并希望按顺序(从左到右)调用所有这些对象.如果返回类型是除void之外的任何内容,我可以使用初始化列表来执行此操作:

struct ExampleFunctor{
    void operator()(){someGlobal = 4;}
};

template<typename... Ts>
struct CallThem {
    void operator()(){
        auto list = {Ts()()...};
    }
}
Run Code Online (Sandbox Code Playgroud)

但是如果返回类型为void,则此技巧不起作用.

我可以将所有Ts包装在一个包装器中,返回一个int,但这似乎有点过分了,这段代码最终将在带有32K闪存的皮质M3上运行,所以如果我在debug中编译单元,那么包装器的额外函数调用开销会很痛苦模式(在释放模式下调试会让我的大脑受伤).

有没有更好的办法?

dyp*_*dyp 6

使用逗号运算符:

int someGlobal;

struct ExampleFunctor{
    void operator()(){someGlobal = 4;}
};

template<typename... Ts>
struct CallThem {
    void operator()(){
        int list[] = {(Ts()(),0)...};
        (void)list;
    }
};

int main()
{
    CallThem<ExampleFunctor, ExampleFunctor>{}();
}
Run Code Online (Sandbox Code Playgroud)

顺便说一下,我不是在initializer_list这里使用,而只是一个阵列; 尝试自己哪一个/如果它们中的任何一个可以被编译器扔掉.该(void)list是抑制警告(未使用的变量).