推断成员函数的返回类型
Deduce return type of member function
在模板函数中,我试图创建一个std::vector
,其value_type
依赖于该函数的模板参数的成员函数。此模板参数仅限于包含具有特定函数的特定类型的唯一指针的向量。例如:
/* somewhere in the code */
std::vector< std::unique_ptr< Widget > > myVec;
/* work with myVec and fill it, then call the relevant function */
func(myVec);
现在函数func
需要检索Widget
的成员函数member_func
的返回类型。请注意,Widget
也可以是不同的类型,只要它具有成员函数member_func
。
template <typename Vec>
void func(const Vec& vec) {
using ret_type = decltype(Vec::value_type::element_type::member_func()); // Doesn't work
std::vector< ret_type > local_vec;
}
我尝试过各种方法,例如std::result_of
,std::invoke_result
和decltype
,但我似乎无法使它工作。这是否可能,如果是,如何实现?
这接近你想要的吗?
#include <vector>
#include <utility>
#include <memory>
struct Foo
{
int member_func();
};
template <typename Vec>
void func(const Vec& vec) {
using ret_type = decltype(std::declval<typename Vec::value_type>()->member_func());
std::vector< ret_type > local_vec;
}
int main()
{
std::vector<std::unique_ptr<Foo>> v;
func(v);
}
演示:https://godbolt.org/g/dJkSf1
解释:
std::declval<typename Vec::value_type>()
生成对unique_ptr的引用(必须在未计算的上下文中使用(。然后我们取调用generated_reference->member_function()
的 cltype。
这将与结果相同vec[0]->member_func()
事实上,我们可以这样写:
template <typename Vec>
void func(const Vec& vec) {
using ret_type = decltype(vec.at(0)->member_func());
std::vector< ret_type > local_vec;
}
这可能更具表现力和通用性(Vec
现在可能是任何类似矢量的类型,并且包含类似指针的东西Foo
(
此外,我们越笼统地接近演绎,我们的func
函数就越通用:
#include <vector>
#include <utility>
#include <memory>
#include <set>
#include <iterator>
struct Foo
{
int member_func();
};
template <typename Vec>
void func(const Vec& vec) {
using ret_type = decltype((*std::begin(vec))->member_func());
std::vector< ret_type > local_vec;
}
int main()
{
std::vector<std::unique_ptr<Foo>> v;
func(v);
func(std::array<std::unique_ptr<Foo>, 10> { });
Foo* foos[] = { nullptr, nullptr };
func(foos);
func(std::set<std::shared_ptr<Foo>, std::owner_less<>> {});
}
注意
此代码假定Foo::member_func
的return_type不是引用类型。
如果有可能,我们需要决定是否使用元编程来:
a( 将引用类型转换为 std::reference_wrapper,以便它们可以存储在向量中,或者
b( 使用std::decay
将引用类型转换为基本类型,这将导致制作副本。
相关文章:
- 如何获取std::result_of函数的返回类型
- 如何建立使用模板函数的lambda函数的尾部返回类型
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 特征::矩阵<双精度,1,3> 结构类型函数中的返回类型函数
- 函数作为模板参数,是否对返回类型强制约束
- C++中函数的向量返回类型引发错误
- 检查函数返回类型是否与STL容器类型值相同
- 警告:在函数返回类型 [-Wignore 限定符] 时忽略类型限定符
- 为什么 c++(g++) 不允许模板返回类型和函数名称之间有空格?
- 为什么返回类型的'const'限定符对标有 __forceinline/内联的函数没有影响?
- 在 c++ 中将函数返回类型指定为模板参数
- 使用 SWIG 更改生成的 CS 函数中的返回类型
- C++ 这里有一个返回 (24) 的布尔返回类型函数
- 使用SFINAE来检测void返回类型函数的存在
- 模板返回类型函数如何在C++中工作
- 如何在返回类型函数模板的专用化中使用派生类型?( "couldn't infer template argument" )
- Bon appetit :从 int 返回类型函数在 main() 中打印字符串
- 在引用或指针返回类型函数上输入
- 在后面的返回类型函数语法中,auto关键字背后是否有意图
- 我可以在c++中重写字符串返回类型函数吗?