【发布时间】:2015-07-07 16:56:38
【问题描述】:
我想创建一个带有任意签名的简单无操作 std::function 对象。为此,我创建了两个函数:
template <typename RESULT, typename... ArgsProto>
std::function<RESULT(ArgsProto...)> GetFuncNoOp()
{
// The "default-initialize-and-return" lambda
return [](ArgsProto...)->RESULT { return {}; };
}
template <typename... ArgsProto>
std::function<void(ArgsProto...)> GetFuncNoOp()
{
// The "do-nothing" lambda
return [](ArgsProto...)->void {};
}
这些都足够好(显然第一个版本可能会在RESULT 对象中创建未初始化的数据成员,但实际上我认为这不会有太大问题)。但是第二个,void-returning 版本是必要的,因为return {}; never 返回void(这将是一个编译错误),它不能写成模板专业化第一个是因为初始签名是可变的。
所以我不得不在这两个函数之间进行选择,只实现一个,或者给它们不同的名字。但我真正想要的只是轻松地初始化std::function 对象,这样,当被调用时,它们除了抛出异常之外什么都不做。这可能吗?
注意the default constructor of std::function does not do what I want。
【问题讨论】:
-
std::function< std::string const&() >是该技术失败的一个例子(实际上,不能失败)。 -
@Yakk 对,因为(当然)“无操作”函数不可能返回引用,因为它可能返回对什么的引用?
-
static T; return T;;) -
@Yakk 哦,对,当然。可以通过返回
static anything instance{}之类的内容将其应用于您的解决方案吗? -
@MSalters 而不是
=delete在编译时捕获错误。一个总是抛出的函数似乎是一个不好的函数来存储在某个地方!
标签: c++ c++11 lambda variadic-templates std-function