gpt4 book ai didi

c++ - 从模板函数返回多个值作为 std::tuple

转载 作者:行者123 更新时间:2023-11-30 05:18:34 25 4
gpt4 key购买 nike

试图让这段代码工作,但很难找到解决方案。我知道我不能重载返回类型,但不确定如何解决它。

我收到此错误,但不确定它从何处获取 std::basic_string 非引用? error C2440: 'return': cannot convert from 'std::tuple<std::basic_string<char,std::char_traits<char>,std::allocator<char>>,int &,float &>' to 'std::tuple<std::string &,int &,float &>'

#include <functional>
#include <iostream>
#include <string>
#include <tuple>

template <typename T>
T Get();

template <>
std::string Get() { return std::string{ "Hello" }; }

template <>
int Get(){ return 42; }

template <>
float Get() { return 42.0; }

template <typename T>
std::tuple<T> Generate()
{
return std::make_tuple(Get<T>());
}

template <typename T1, typename... Ts>
std::tuple<T1,Ts...> Generate()
{
auto t = std::make_tuple(Get<T1>());
return std::tuple_cat(t, Generate<Ts...>());
}

struct A
{
template <typename... Ts >
operator std::tuple<Ts...> ()
{
return Generate<Ts...>();
}
};

int main()
{
std::string s;
int i;
float f;
A as;
std::tie(s, i, f) = as;
}

最佳答案

std::tie(s, i, f) = as;

左边是tuple<string&,int&,float&> ,因此右侧将尝试转换为相同的东西。注意那些引用。所以为了这个工作,Generate将必须返回匹配类型。所以make_tuple必须去,那必须是tie .但是你的Get函数也需要返回引用。可以做。当我这样做时,我简化了 Generate 调用以使其不递归。

template <typename T>
T Get();

//note references, and a static variable, and explicitly saying T
template <>
std::string& Get<std::string&>() { static std::string a{ "Hello" }; return a;}

template <>
int& Get<int&>(){ static int a{42}; return a; }

template <>
float& Get<float&>() { static float a{42.0f}; return a; }

// note tie and non-recursive
template <typename ...T>
std::tuple<T...> Generate()
{
return std::tie(Get<T>()...);
}

struct A
{
template <typename... Ts >
operator std::tuple<Ts...> ()
{
return Generate<Ts...>();
}
};

int main()
{
std::string s;
int i;
float f;
A as;
std::tie(s, i, f) = as;
std::cout << "pass";
}

执行证明:http://coliru.stacked-crooked.com/a/036817509172da69

如 SU3 所述,Generate是多余的。本来可以

struct A
{
template <typename... Ts >
operator std::tuple<Ts...> ()
{
return std::tie(Get<T>()...);
}
};

关于c++ - 从模板函数返回多个值作为 std::tuple,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41644921/

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