我如何找到模板函数返回的类型

emik_g

我需要为这样的事情找到模板函数结果的类型:

template<typename T>
T fun1(
T arg1,
result_fun<T>(some_fun)
);

或类似的东西。所以在标准库中我找到了 result_of(我也找到了 invoke_result,它也不起作用)。所以我找到了我找到这个函数语法的帖子它适用于sipmle代码,但是......它不适用于指针......示例(它和 ideone 代码相等):

#include <iostream>
#include <type_traits>

using namespace std;

template <typename T>
T *some(T x){
    return &x;
}

template<typename T>
void somestrange(T x, typename result_of<decltype(&some<decltype(x)>)(decltype(x))>::type z);

template<typename T>
void somestrange(T x, typename result_of<decltype(&some<decltype(x)>)(decltype(x))>::type z){
    cout << is_same<decltype(x), int>() << endl
     << is_same<decltype(z), int *>();
}

int main(){
    int x = 0;
    int *z = nullptr;
    somestrange(x, z);
    return 0;
}

它会工作,但如果模板接收指针......

#include <iostream>
#include <type_traits>

using namespace std;

template <typename T>
T **some(T *x){
    return &x;
}

template<typename T>
void somestrange(T x, typename result_of<decltype(&some<decltype(x)>)(decltype(x))>::type z);

template<typename T>
void somestrange(T x, typename result_of<decltype(&some<decltype(x)>)(decltype(x))>::type z){
    cout << is_same<decltype(x), int>() << endl
     << is_same<decltype(z), int *>();
}

int main(){
    int *x = 0;
    int **z = nullptr;
    somestrange(x, z);
    return 0;
}

编译会生气。所以我想我能做什么。我创建自己的WEEL ...所以我写类似这样

#include <iostream>
#include <type_traits>
#include <utility>
#include <typeinfo>

using namespace std;

template<typename Fun, typename Arg>
inline auto myinvoke(Fun&& f, Arg&& arg)
    -> decltype(forward<Fun>(f)(forward<Arg>(arg)))
{
    return (forward<Fun>(f)(forward<Arg>(arg)));
}

template<typename Fun, typename Arg>
struct return_type {
    using type = decltype(myinvoke(declval<Fun>(), declval<Arg>()));
};

template<typename Fun, typename Arg>
using return_type_t = typename return_type<Fun, Arg>::type;


template <typename T>
T *some(T x){
    return &x;
}

template<typename T>
void somestrange(T x, return_type_t<decltype(some<T>), T> z);

template<typename T>
void somestrange(T x, return_type_t<decltype(some<T>), T> z){
    cout << is_same<decltype(x), int>() << endl
     << is_same<decltype(z), int *>();
}

int main(){
    int x = 0;
    int *z = nullptr;
    somestrange(x, z);
    return 0;
}

但如果我在这里,你可以猜到它不起作用。你会是对的,因为它不适用于ptr,同样不能工作 result_of:

#include <iostream>
#include <type_traits>
#include <utility>
#include <typeinfo>

using namespace std;

template<typename Fun, typename Arg>
inline auto myinvoke(Fun && f, Arg&& arg)
    -> decltype(forward<Fun>(f)(forward<Arg>(arg)))
{
    return (forward<Fun>(f)(forward<Arg>(arg)));
}

template<typename Fun, typename Arg>
struct return_type {
    using type = decltype(myinvoke(declval<Fun>(), declval<Arg>()));
};

template<typename Fun, typename Arg>
using return_type_t = typename return_type<Fun, Arg>::type;


template <typename T>
T **some(T *x){
    return &x;
}

template<typename T>
void somestrange(T x, return_type_t<decltype(some<T>), T> z);

template<typename T>
void somestrange(T x, return_type_t<decltype(some<T>), T> z){
    cout << is_same<decltype(x), int>() << endl
     << is_same<decltype(z), int *>();
}

int main(){
    int *x = 0;
    int **z = nullptr;
    somestrange(x, z);
    return 0;
}

那么我能用它做什么呢?有人知道我如何解决这个问题(我只能使用 STL)?谢谢回答

杰洛德42

int *x = 0;
int **z = nullptr;
somestrange(x, z);

template<typename T>
void somestrange(T x, return_type_t<decltype(some<T>), T> z);
  • T 将会 int*
  • some<T>期望T*参数

所以改为

template<typename T>
void somestrange(T* x, return_type_t<decltype(some<T>), T*> z);

或者

template<typename T>
void somestrange(T* x, return_type_t<decltype(some<std::remove_pointer_t<T>>), T> z);

演示

或者不明确指定模板,并允许推导:

template<typename T>
void somestrange(T x, decltype(some(std::declval<T>())) z);

演示

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何避免模板函数返回类型重复?

来自分类Dev

让函数返回模板类型

来自分类Dev

如何获取函数返回类型的模板成员的解引用类型

来自分类Dev

如何获取函数返回类型的模板成员的解引用类型

来自分类Dev

在C ++ 11中,我如何专门化基于返回类型接受函数对象的函数模板?

来自分类Dev

如何创建返回类型的constexpr函数(用于模板参数)

来自分类Dev

如何专门设计用于返回不同类型的模板函数?

来自分类Dev

Java模板如何返回带有模板类型的函数参数类类型实例

来自分类Dev

从函数返回类型推断模板参数类型

来自分类Dev

我如何执行从区分的联合返回函数的类型

来自分类Dev

非模板函数中的尾随返回类型

来自分类Dev

模板参数类的函数调用的返回类型

来自分类Dev

C ++类模板作为函数返回类型

来自分类Dev

如何在模板参数中分隔函数类型的返回类型和参数

来自分类Dev

如何获得传递给模板化函数或类的函数的返回类型?

来自分类Dev

如何根据“类似函数”的参数推断函数模板的返回类型?

来自分类Dev

函数模板中返回类型的模板参数推导

来自分类Dev

C ++模板函数根据模板参数返回类型

来自分类Dev

C ++ 11:如何编写两个返回类型不同的模板函数

来自分类Dev

如何使用SFINAE对非模板函数进行优先级排序,同时还提供返回类型?

来自分类Dev

如何使C ++模板化函数与返回类型无关,以便将来进行专门化

来自分类Dev

如何创建返回类型的constexpr函数(将在模板参数中使用)

来自分类Dev

如何在手动编码时以直接的方式检测模板函数的适当返回类型

来自分类Dev

如何允许编译器为模板化的 get 函数推导出正确的返回类型?

来自分类Dev

从迭代器推导值类型以获取模板函数的返回类型

来自分类Dev

从函数模板类型中提取返回类型

来自分类Dev

从迭代器推导值类型以获取模板函数的返回类型

来自分类Dev

可变参数模板函数确定函数指针的返回类型

来自分类Dev

可变参数模板函数确定函数指针的返回类型

Related 相关文章

  1. 1

    如何避免模板函数返回类型重复?

  2. 2

    让函数返回模板类型

  3. 3

    如何获取函数返回类型的模板成员的解引用类型

  4. 4

    如何获取函数返回类型的模板成员的解引用类型

  5. 5

    在C ++ 11中,我如何专门化基于返回类型接受函数对象的函数模板?

  6. 6

    如何创建返回类型的constexpr函数(用于模板参数)

  7. 7

    如何专门设计用于返回不同类型的模板函数?

  8. 8

    Java模板如何返回带有模板类型的函数参数类类型实例

  9. 9

    从函数返回类型推断模板参数类型

  10. 10

    我如何执行从区分的联合返回函数的类型

  11. 11

    非模板函数中的尾随返回类型

  12. 12

    模板参数类的函数调用的返回类型

  13. 13

    C ++类模板作为函数返回类型

  14. 14

    如何在模板参数中分隔函数类型的返回类型和参数

  15. 15

    如何获得传递给模板化函数或类的函数的返回类型?

  16. 16

    如何根据“类似函数”的参数推断函数模板的返回类型?

  17. 17

    函数模板中返回类型的模板参数推导

  18. 18

    C ++模板函数根据模板参数返回类型

  19. 19

    C ++ 11:如何编写两个返回类型不同的模板函数

  20. 20

    如何使用SFINAE对非模板函数进行优先级排序,同时还提供返回类型?

  21. 21

    如何使C ++模板化函数与返回类型无关,以便将来进行专门化

  22. 22

    如何创建返回类型的constexpr函数(将在模板参数中使用)

  23. 23

    如何在手动编码时以直接的方式检测模板函数的适当返回类型

  24. 24

    如何允许编译器为模板化的 get 函数推导出正确的返回类型?

  25. 25

    从迭代器推导值类型以获取模板函数的返回类型

  26. 26

    从函数模板类型中提取返回类型

  27. 27

    从迭代器推导值类型以获取模板函数的返回类型

  28. 28

    可变参数模板函数确定函数指针的返回类型

  29. 29

    可变参数模板函数确定函数指针的返回类型

热门标签

归档