【发布时间】:2014-04-12 17:10:24
【问题描述】:
我想为带有 begin 和 end 迭代器的 std 函数创建包装器,以便它们也可以采用整个容器。例如,像
std::for_each(mycont, FUNC)
而不是
std::for_each(mycont.begin(), mycont.end(), FUNC)
我总体上了解分离算法和容器的好处,但我经常想对整个容器做一些事情,这种语法对我来说会更方便。如果你不同意,那也没关系。
我尝试了以下方法,但无法编译
namespace stx
{
template<class CONT, class FUNC, class ...Ts>
void blah(CONT& cont, FUNC func, Ts... args)
{
func(cont.begin(), cont.end(), args...);
}
}
struct Bob
{
void stuff()
{
}
};
std::vector<Bob> bobs(3);
stx::blah(bobs, &std::for_each, &Bob::stuff);
error C2783: 'void stx::blah(CONT &,FUNC,Ts...)' : could not deduce template argument for 'FUNC'
我做错了什么? (VS2013)
【问题讨论】:
-
for_each 本身是一个模板函数,但编译器无法推断它的参数,因为它与它的用法没有关系(实际上你只是传递一个函数指针)。您必须明确指定模板参数或以某种方式关联它们(不仅仅是 FUNC,还有与 CONT 相关的东西)。
-
此外,在函数的参数中包含函数指针通常是个坏主意。为了实现您想要做的事情并管理重载算法,您可能必须将它们包装在一些函子中。
-
您可能需要考虑 Boost Range 库。它已经定义了采用“范围”参数的算法,并具有将容器视为范围的适配器。
-
不幸的是,我想这样做(你可能尝试过)的方式是通过仿函数使用模板模板参数,但是模板模板参数必须是类(至少在我的工具链上,clang 3.4),not 函数,因此即使使用函子环绕,它也不能作为通用解决方案。如果我遇到了一种方法,我会回帖,但它看起来并不乐观。