【发布时间】:2017-07-19 23:01:43
【问题描述】:
我不确定我的尝试是否符合标准,甚至可能没有意义,所以请随时纠正我。
我正在尝试将可变数量的std::function 对象传递给一个接受可变参数的函数,并且还接受可变模板参数。模板参数指定传入函数的返回类型。函数的签名如下所示:
template <typename ... TRets>
void DoStuff(std::function<TRets...()> funcs...)
我试图做的是将传入的每个funcs 的返回值传递给另一个以扩展值形式接受它们的函数。例如。 std::make_shared<TType>(funcs()...);
我正在使用带有--std=c++17 标志的g++ 7.1.1,这会导致编译器出现段错误。显然它不应该出现段错误,但是标准中是否有任何内容表明上述代码无效?或者,是否有不同的语法来实现这个目标?
为了完整起见,这里是一个最小的工作(对于工作的一些定义)示例:
#include <functional>
#include <memory>
class MyClass {
public:
int m_a;
double m_b;
MyClass(int a, double b) : m_a(a), m_b(b) {};
};
template <typename TReturn, typename ... Args>
std::shared_ptr<TReturn> CallFunctions(std::function<Args...()> funcs...) {
// Do stuff here
return std::make_shared<TReturn>(funcs()...);
}
int main(int argc, char * argv[]) {
auto x = CallFunctions<MyClass, int, double>(
[] () { return 5; },
[] () { return 3.14; }
);
return 0;
}
已编辑以显示我原来问题的更好意图
【问题讨论】:
-
你想做什么?
-
如果编译器出现段错误,您可能需要提交错误报告。
-
您是否希望传入
CallFunctions的每个函数都没有参数并返回一个值? -
同意,我将更新到最新版本以确保它仍然不受此错误的影响。如果是的话,我会提交报告。我还编辑了帖子中的代码以更好地显示意图,但@Yakk 的答案足够接近,足以让我得到我需要的东西。
标签: c++ variadic-templates c++17 variadic-functions