什么是std :: function :: argument_type的替代品?

时间:2018-09-28 13:25:43

标签: c++ function

根据cppreference.com,以下所有三个:argument_typefirst_argument_typesecond_argument_type在C ++ 17中已弃用,在C ++ 20中已删除。

这些成员类型的标准库替换是什么?我的意思是我可以编写自己的类型特征,但是我怀疑某些东西会在没有适当替换标准库的情况下被删除。

例如:

template <typename F> 
void call_with_user_input(F f) {
    typename F::first_argument_type x;  // what to use instead ??
    std::cin >> x;
    f(x);
}

3 个答案:

答案 0 :(得分:3)

您可以通过引入模板参数来获取类型

template <typename Ret, typename Arg> 
void call_with_user_input(std::function<Ret(Arg)> f) {
    Arg x;
    std::cin >> x;
    f(x);
}

为您提供参数类型作为模板参数。作为奖励,您还可以根据需要获得退货类型。

答案 1 :(得分:1)

据我了解,它们将被删除,仅此而已。 我找到了提案here

first_argument_typesecond_argument_type有关:

  

可适应的功能绑定是在C ++ 17中删除的强大候选对象,但之所以被保留,仅是因为没有足够的替换供一元/二元取反器的用户迁移。该功能std :: not_fn已添加到C ++ 17中,以允许迁移路径

检查std::not_fn for c ++ 17我发现:

  

请注意,由于添加了新的语言功能和库,例如lambda表达式,“钻石”函子等,自适应功能协议在最初设计时就不再起作用。这不是由于缺乏工作量,而是简单地,不可能为其中某些类型(例如多态lambda对象)拥有唯一的typedef集。但是,由于在几个组件中难于有条件地定义成员typedef,我们确实付出了保留库其他地方的支持的代价,例如std :: function用一个或两个参数包装一个函数类型,或者类似地对std :: reference_wrapper用于精确引用一个或两个参数的函数。

这意味着它们将被删除。

first_argument_typesecond_argument_type的问题之一似乎是由于polymorphic lambda objects造成的。

也正如注释中所指出的,任何可以传递给std::variant<...>::visit的具有多个operator()的东西都存在first_argument_type的问题

答案 2 :(得分:0)

一种方法是使用boost::function_types

#include <boost/function_types/parameter_types.hpp>
#include <boost/mpl/at.hpp>

template <typename F> 
void call_with_user_input(F f) {
    using FnType = decltype(&F::operator());
    using FirstArgType = typename boost::mpl::at_c<boost::function_types::parameter_types<FnType>, 0>::type;
    FirstArgType x;
    std::cin >> x;
    f(x);
}