我如何找到模板函数返回的类型
How I can find type of template function return
我需要找到模板函数结果的类型,如下所示:
template<typename T>
T fun1(
T arg1,
result_fun<T>(some_fun)
);
或类似的东西。所以在标准库中,我找到了result_of(我也找到了invoke_result,它也不起作用(。所以我找到了我找到这个函数语法的帖子。它适用于虹吸代码,但是...它不适用于指针...示例(它和 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;
}
编译会生气的。所以我想我能做什么。我创造了自己的威力...所以我写了这样的东西:
#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(?感谢您的回答
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);
演示
相关文章:
- 从函数返回const char*数组
- 检查函数返回类型是否与STL容器类型值相同
- 从 c 或 cpp 系列子函数返回到主函数
- 从函数返回任意简单类型的数据
- 警告:在函数返回类型 [-Wignore 限定符] 时忽略类型限定符
- 从 C++ 中的函数返回数组地址问题
- VirtDisk.h QueryChangesVirtualDisk() 函数返回 RangeCount 为 0
- 为什么glGetSubroutineIndex为不同的函数返回相同的值?
- 在 c++ 中将函数返回类型指定为模板参数
- 从封装在对象中的函数 C++ 返回时为空的列表
- 为什么向量内部的指针在从函数返回时会发生变化?
- 函数返回的 rvalue 引用(表达式)是 xvalue - 但没有标识?
- 程序中的布尔函数返回输入的范围无论如何都是无效的
- 寿命延长从函数返回引用
- 程序不向函数返回值
- 字符串函数返回奇怪的值
- 类的大问题,以及从空函数c++返回
- 为什么在尝试测量函数返回所需的时间时,我的运行时编号是错误的?
- C++二叉搜索树模板从函数返回节点
- NVCC 错误:string_view.h:constexpr 函数返回是非常量