gpt4 book ai didi

c++ - 如何使用 cv 和引用限定符从 std::function 获取参数和返回类型?

转载 作者:行者123 更新时间:2023-11-30 01:13:19 31 4
gpt4 key购买 nike

有没有一种好方法可以从 std::function 中获取参数和返回类型?这样我们也可以返回 cv 和 reference 限定词?这部分与之前的问题有关 here .无论如何,使用答案中的代码,我们有以下示例:

#include <functional>
#include <iostream>

template<typename T>
struct function_traits;

template<typename R, typename ...Args>
struct function_traits<std::function<R(Args...)>> {
static const size_t nargs = sizeof...(Args);

typedef R result_type;

template <size_t i>
struct arg {
typedef typename std::tuple_element<i, std::tuple<Args...>>::type
type;
};
};

template <typename T>
void foo(T const & f) {
typedef function_traits <T> stuff;
std::cout <<
typeid(typename function_traits <T>::result_type).name()
<< std::endl;
std::cout <<
typeid(typename function_traits <T>::template arg<0>::type).name()
<< std::endl;
std::cout << typeid(T).name() << std::endl;
}

int main() {
std::cout << "Function: f" << std::endl;
auto f = [](double x) { return x+1.;};
foo <std::function<double(double)>> (f);

std::cout << std::endl << "Function: g" << std::endl;
auto g = [](double const & x) { return x+1.;};
foo <std::function<double(double const &)>> (g);
}

现在,使用 c++filt,我们可以看到 f 的类型是std::function<double (double)>g 的类型是std::function<double (double const&)> .但是,结构 function_traits报告参数类型相同,但实际上不同。基本上,const&被剥离了 g 的参数类型.有没有办法解决这个问题 const&是否保留?

最佳答案

const 和引用被 typeid 剥离,而不是被 function_traits 剥离。尝试添加

std::cout << std::boolalpha << std::is_same<double,
typename function_traits<T>::template arg<0>::type>::value << std::endl;
std::cout << std::boolalpha << std::is_same<const double&,
typename function_traits<T>::template arg<0>::type>::value << std::endl;

到您的 foo,您将看到预期的值。

关于c++ - 如何使用 cv 和引用限定符从 std::function 获取参数和返回类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32487406/

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