代码之家  ›  专栏  ›  技术社区  ›  463035818_is_not_an_ai

std::function::argument\u type的替代品是什么?

  •  11
  • 463035818_is_not_an_ai  · 技术社区  · 6 年前

    cppreference.com 以下三项: argument_type , first_argument_type second_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 回复  |  直到 6 年前
        1
  •  3
  •   NathanOliver    6 年前

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

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

    将参数类型作为模板参数提供。作为奖励,如果你需要的话,你还可以得到回报类型。

        2
  •  2
  •   Raxvan    6 年前

    我找到了建议 here

    first_argument_type second_argument_type :

    可适应函数绑定是C++ 17中移除的强有力候选,但仅保留了因为没有足够的替换来将一元/二进制否定符的用户迁移到。这个特性,STD::Nothfn,被添加到C++ 17中,允许迁移路径,

    std::not_fn 对于c++17,我发现:

    请注意,由于添加了新的语言特性和库(如lambda表达式、“菱形”函子等),自适应函数协议在最初设计时不再起作用。这并不是因为缺乏努力,而是因为不可能为其中一些类型(例如多态lambda对象)提供一组唯一的typedef。然而,我们确实为在库中的其他地方保留支持付出了代价,这是由于在一些组件中有条件地定义了笨拙的成员typedef,例如std::function包装一个只有一个或两个参数的函数类型,或者类似地为std::reference\u包装一个只有一个或两个参数的函数引用。

    这意味着它们将被移除。

    问题之一是 第一个参数类型 polymorphic lambda objects .

    operator() 可以传递给 std::variant<...>::visit 有问题吗

        3
  •  0
  •   Maxim Egorushkin    6 年前

    一种方法是使用 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);
    }