gpt4 book ai didi

c++ - 我怎样才能制作一个模板函数,它接受一个参数,这个参数是 boost::bind 的结果?

转载 作者:行者123 更新时间:2023-11-30 05:21:30 24 4
gpt4 key购买 nike

我有一个将 boost::function<> 作为输入的辅助方法键入对象并用另一个处理其他物流的仿函数包装该函数。

我的签名是这样的:

class Example {
public:
typedef ... Callback;

...

template<typename T>
static Callback make_wrapper( const boost::function<void( T )>& );
};

如果我尝试将调用 boost::bind 的结果传递给 make_wrapper内联我得到有关类型不兼容的编译错误(Apple LLVM 版本 7.3.0)

class OtherClass {
public:
void method ( uint32_t );
};

OtherClass* other;

Example::Callback c = Example::make_wrapper ( boost::bind( &OtherClass::method, other, _1 ) );

这给出:

error: no matching function for call to 'make_wrapper'
note: candidate template ignored: could not match 'function' against 'bind_t'

我找到了两种解决方法:

  1. 临时变量:

    boost::function<void( uint32_t )> f = boost::bind( &OtherClass::method, other, _1 );
    Example::Callback c = Example::make_wrapper ( f );
  2. 调用 make_wrapper 的特定特化:

    Example::Callback c = Example::make_wrapper<uint32_t> ( boost::bind( &OtherClass::method, other, _1 ) );

如果我可以跳过额外的提示并通过内联调用绑定(bind)来调用 make_wrapper,我会更喜欢它。

有没有一种方法可以声明 make_wrapper 模板的签名以帮助编译器确定类型,而无需使用上述解决方法之一?

最佳答案

无论何时使用bind,您都会丢弃有关绑定(bind)函数参数类型的所有信息。函数模板不可能推断出参数类型 T,因为 bind 的返回值是一个函数对象,可以使用任意数量的任意类型的参数调用。

您可以将 bind 函数包装到辅助函数模板中以推导出绑定(bind)的成员函数,尤其是它的结果类型和参数(示例使用 std::bindstd::function 但我相信它可以很容易地转换为 boost):

#include <iostream>
#include <string>
#include <functional>

struct foo {
void bar(int a, std::string s) {
std::cout << a << " " << s << std::endl;
}
};


template<typename T1, typename T2>
void make_wrapper(const std::function<void( T1, T2 )>&) {
}

template <class Foo, class Res, class... Args, class... Placeholders>
std::function<Res(Args...)> my_bind(Res (Foo::*bar)(Args...), Foo& f, Placeholders... ps) {
return std::bind(bar, f, ps...);
}

int main() {
foo f;
make_wrapper(my_bind(&foo::bar, f, std::placeholders::_1, std::placeholders::_2));
}

只要 foo::bar 没有重载,代码就会正常工作,在这种情况下,您无法避免 static_cast

关于c++ - 我怎样才能制作一个模板函数,它接受一个参数,这个参数是 boost::bind 的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40052202/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com