Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何从带有cv和引用限定符的std::函数中获取参数和返回类型?_C++_C++11_C++14 - Fatal编程技术网

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++过滤器。