C++ 如何从带有cv和引用限定符的std::函数中获取参数和返回类型?
有没有一种好方法可以从C++ 如何从带有cv和引用限定符的std::函数中获取参数和返回类型?,c++,c++11,c++14,C++,C++11,C++14,有没有一种好方法可以从std::function中获取参数和返回类型,这样我们也可以返回cv和引用限定符?这部分涉及到前面的一个问题。在任何情况下,使用答案中的代码,我们有以下示例: #include <functional> #include <iostream> template<typename T> struct function_traits; template<typename R, typename ...Args> stru
std::function
中获取参数和返回类型,这样我们也可以返回cv和引用限定符?这部分涉及到前面的一个问题。在任何情况下,使用答案中的代码,我们有以下示例:
#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);
}
#包括
#包括
模板
结构功能特征;
模板
结构功能特性{
静态常数size\u t nargs=sizeof…(Args);
typedef R result_type;
模板
结构参数{
typedef typename std::tuple_元素::type
类型;
};
};
模板
无效foo(T const&f){
typedef函数;
std::coutconst
和reference通过typeid
剥离,而不是通过function\u 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;
std::cout常量和引用由typeid
剥离,而不是由function\u 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;
std::cout谢谢!顺便问一下,有没有一种方法可以不使用is_-same打印简历限定符?基本上,一个版本的typeid
保留了所有限定符。一种快速的方法是typeid(wrap)
忽略输出中的wrap
部分。谢谢你的提示。除非我遗漏了什么,并且万一有人尝试这样做,否则这个技巧需要定义,template struct wrap{}
。然后,我们看到类似的东西:wrap
出自c++filt。谢谢!顺便问一下,有没有一种方法可以不使用is_same打印cv限定符?基本上,一个版本的typeid
保留了所有限定符。一种快速的方法是typeid(wrap)
忽略输出中的wrap
部分。谢谢你的提示。除非我遗漏了什么,并且万一有人尝试这样做,否则这个技巧需要定义,template struct wrap{};
。然后,我们会看到类似这样的内容:wrap
出自c++过滤器。