このコードを動作させようとしましたが、解決策を見つけようとしました。私は戻り値の型をオーバーロードすることはできませんが、それを解決する方法はわかりません。テンプレート関数から複数の値をstd :: tupleとして返します。
このエラーは発生していますが、どこから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;
}
+1戻り値が割り当てられているオブジェクトのタイプに基づいて、関数テンプレートのパラメータを推測できることはわかりませんでした。 – SU3
@ SU3:それはかなり秘話です。テンプレート演算子T() 'のみで動作し、完全一致(参照とconstを除く)のみ行います。また、どのタイプにも割り当てることができるため、いくつかのエラーメッセージが表示されます。 –
ありがとう..これは質問に答えますが、実際にはget関数に渡すためのインデックスが必要なので、私は再帰を必要とします。このテストケースではなく、私が実際に使っているコードでこれを行う方法はありますか? – TLoe