Boost bind and 'result_type': 不是成员,c++03 友好
Boost bind and 'result_type': is not a member, c++03-friendly
Visual Studio 2019 的最新 16.6 更新删除了 std::plus::result_type
、std::minus::result_type
和相关的类型定义。 (它们在 C++17 中被弃用并在 C++20 中被删除。)代码的一个大大简化的版本如下所示:
template <typename FF>
struct function_wrapper {
function_wrapper(FF func, const std::string& name) : func_(func), name_(name) { }
int operator()(int i1, int i2) const { return func_(i1, i2); }
// ... other stuff ...
FF func_;
std::string name_;
};
template <typename FF>
int use_function(const function_wrapper<FF>& func, const std::pair<int, int>& args) {
return func(args.first, args.second);
}
funcWrapper<boost::function<int(int, int)>> plus_func(std::plus<int>(), "plus");
std::cout << use_function(plus_func, std::make_pair<int, int>(1, 2)) << std::endl;
更新后,不再编译,生成错误:
boost.72.0\boost\bind\bind.hpp(75,25): error C2039: 'result_type': is not a member of 'std::plus<int>'
我无法将 result_type
typedef 添加回 std::plus
,因此我需要另一种方法来解决此问题。问题是,生成的代码也需要在 C++03 下编译,因此 lambda 和 >=C++11 构造不是可行的选择。我可以重新实现 std::plus
并自己添加现在删除的 typedef 以使 Boost 满意,但是有更好的方法吗?
用以下方式包装旧仿函数:
template <typename F>
struct functor;
template <template <typename> class F, typename T>
struct functor<F<T> > : F<T>
{
typedef T result_type;
typedef T first_argument_type;
typedef T second_argument_type;
};
然后:
function_wrapper<boost::function<int(int, int)> >
plus_func(functor<std::plus<int> >(), "plus");
// ~~~~~~~^ ~^~
或者,您可以调用 boost::bind
将结果类型指定为模板参数:
boost::bind<int>(func, args...);
或:
boost::bind(boost::type<int>(), func, args...);
Visual Studio 2019 的最新 16.6 更新删除了 std::plus::result_type
、std::minus::result_type
和相关的类型定义。 (它们在 C++17 中被弃用并在 C++20 中被删除。)代码的一个大大简化的版本如下所示:
template <typename FF>
struct function_wrapper {
function_wrapper(FF func, const std::string& name) : func_(func), name_(name) { }
int operator()(int i1, int i2) const { return func_(i1, i2); }
// ... other stuff ...
FF func_;
std::string name_;
};
template <typename FF>
int use_function(const function_wrapper<FF>& func, const std::pair<int, int>& args) {
return func(args.first, args.second);
}
funcWrapper<boost::function<int(int, int)>> plus_func(std::plus<int>(), "plus");
std::cout << use_function(plus_func, std::make_pair<int, int>(1, 2)) << std::endl;
更新后,不再编译,生成错误:
boost.72.0\boost\bind\bind.hpp(75,25): error C2039: 'result_type': is not a member of 'std::plus<int>'
我无法将 result_type
typedef 添加回 std::plus
,因此我需要另一种方法来解决此问题。问题是,生成的代码也需要在 C++03 下编译,因此 lambda 和 >=C++11 构造不是可行的选择。我可以重新实现 std::plus
并自己添加现在删除的 typedef 以使 Boost 满意,但是有更好的方法吗?
用以下方式包装旧仿函数:
template <typename F>
struct functor;
template <template <typename> class F, typename T>
struct functor<F<T> > : F<T>
{
typedef T result_type;
typedef T first_argument_type;
typedef T second_argument_type;
};
然后:
function_wrapper<boost::function<int(int, int)> >
plus_func(functor<std::plus<int> >(), "plus");
// ~~~~~~~^ ~^~
或者,您可以调用 boost::bind
将结果类型指定为模板参数:
boost::bind<int>(func, args...);
或:
boost::bind(boost::type<int>(), func, args...);