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

标签 c++ templates c++11 metaprogramming variadic-templates

我有一个参数包,其中包含默认的可构造对象和可调用对象(如 ExampleFunctor),我想按顺序(从左到右)调用所有这些对象。如果返回类型是除 void 之外的任何类型,我可以使用初始化列表来执行此操作:

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

template<typename... Ts>
struct CallThem {
    void operator()(){
        auto list = {Ts()()...};
    }
}

但是,如果返回类型为 void,则此技巧无效。

我可以将所有 T 包装在一个返回 int 的包装器中,但这似乎有些过分,而且这段代码最终将在具有 32K 闪存的 cortex M3 上运行,因此如果我编译 Debug模式下的单元(在 Release模式下调试让我的大脑受伤)。

有没有更好的办法?

最佳答案

使用逗号运算符:

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

顺便说一句,我在这里没有使用initializer_list,而只是一个数组;自己尝试哪一个/如果其中任何一个可以被编译器丢弃。 (void)list 用于抑制警告(未使用的变量)。

关于c++ - 如果函数返回类型为 void,我应该如何调用可变参数包中的所有函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19860851/

相关文章:

c++ - 在结构中分配 std::string 的段错误

c++ - 访问 std::pair 数组的元素时出错

c++ - 如何获得使用 TextOut 打印的字符之间的间距?

perl - Mac OS X 中有两个版本的 Perl?

templates - 我怎样才能得到dag中的execution_date?运算符的外部?

C++: "Virtual"是否继承给所有后代

json - 在Play 2.0中使用JSON模板

C++: std::vector - "slice"一个 vector 是可能的吗?

c++ - 基于标签分派(dispatch)的特化,用于 C++ 代码中的平台识别和仿真

c++ - 可变参数模板的歧义