gpt4 book ai didi

c++ - 推断成员函数的返回类型

转载 作者:太空狗 更新时间:2023-10-29 20:51:18 24 4
gpt4 key购买 nike

在模板函数中,我试图创建一个 std::vector,其 value_type 依赖于函数的模板参数的成员函数。此模板参数仅限于包含具有特定功能的特定类型的唯一指针的 vector 。例如:

/* 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_ofstd::invoke_resultdecltype,但我似乎无法让它工作。这是否可能?如果可能,如何实现?

最佳答案

这接近您想要的吗?

#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 的引用(必须在未计算的上下文中使用)。然后我们采用调用的 decltype generated_reference->member_function() .

这与 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 现在可以是任何类似 vector 的类型,并且包含指向 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,以便它们可以存储在 vector 中,或者

b) 使用 std::decay 将引用类型转换为基本类型,这将导致制作拷贝。

关于c++ - 推断成员函数的返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50716296/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com