根据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);
}
答案 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_type
和second_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_type
和second_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);
}