C++(0x) 中是不是存在无操作“啥都不做”函数对象?
Posted
技术标签:
【中文标题】C++(0x) 中是不是存在无操作“啥都不做”函数对象?【英文标题】:Does a no-op "do nothing" function object exist in C++(0x)?C++(0x) 中是否存在无操作“什么都不做”函数对象? 【发布时间】:2011-02-28 06:47:07 【问题描述】:我意识到这是一个可笑的问题,因为它需要不到 2 秒的时间来实现。但我依稀记得读过新标准引入了一个。
我对 VC10 的标题进行了 grep 处理,但一无所获。你能帮我吗?烦死我了! :)
编辑:
转念一想,我记得的新仿函数可能是不相关的std::default_deleter
。
【问题讨论】:
多么浪费 AirMiles 积分。想象一下,如果这不是一个 CW 问题,您可以节省多少! 【参考方案1】:你总是可以写一个无操作的 lambda:[]
【讨论】:
我喜欢这个,但它不适用于我散布的std::conditional
的数量。一个空的std::function
将抛出 operator()。
是的,但每个[]
都是不同的类型。我可以看到为 no-op 函数使用单一名称的几个优点。【参考方案2】:
在我期望函子不返回任何值的情况下,我将其用作插入式无操作。
struct VoidNoOp
void operator()() const
template<class A>
void operator()(A a) const (void)(a);
template<class A, class B>
void operator()(A a, B b) const (void)(a); (void)(b);
template<class A, class B, class C>
void operator()(A a, B b, C c) const (void)(a); (void)(b); (void)(c);
;
这里是任意数量参数的 C++11 变体:
struct VoidNoOp
void operator()() const ;
template<typename P1, typename... Params>
void operator()(P1 p1, Params... parameters)
(void)(p1); // we do this just to remove warnings -- requires the recursion
operator()(parameters...);
;
【讨论】:
【参考方案3】:这个怎么样?
// Return a noop function
template <typename T>
struct noop
T return_val;
noop (T retval = T ())
: return_val (retval)
T
operator (...)
return return_val;
;
template <>
struct noop<void>
void
operator (...)
;
这应该适用于任何用途。
【讨论】:
请注意,如果您尝试将非平凡可复制的类型作为参数传递给 noop,则会失败,因为它们不适用于 ...【参考方案4】:您可能正在考虑身份函数(std::identity,显然它已在当前草案中被删除),但这不是一回事。
【讨论】:
我知道identity
,但因为它是一元而忽略了它。我记得六个月前需要一个通用的 default_deleter 来做某事……不太记得是为了什么。以上是关于C++(0x) 中是不是存在无操作“啥都不做”函数对象?的主要内容,如果未能解决你的问题,请参考以下文章