1

私はこのようなクラスを持っています:

template<typename ...Els>
class Istr {
    std::tuple<Els...> Vals 
}

class Istr1 : public Istr<std::string> {
     void Do() { std::get<0>(Vals) = "Meh."; }
}

このように使用できる関数テンプレートを定義する方法はありますか?

Tok(0) = "Meh."
Istr i; i.Tok(0) = "Meh."

または、それが不可能な場合は、このように?

Tok<0>() = "Meh."

私の素朴なアプローチでは、間違ったコードを思いつきました:

template<typename T>
T Tok(size_t i) { return std::get<i>(Vals); }

Tそして、それを使用してテンプレートを暗黙的にインスタンス化するとき、コンパイラーは実際に型を推測できません。

4

2 に答える 2

4
template<size_t i>
auto Tok() -> decltype( std::get<i>(Vals) ) {
    return std::get<i>(Vals);
}

ライブデモ

于 2016-01-09T18:32:24.927 に答える
0
// Deduce `TI` thanks to the function argument.
template<typename TTuple, typename TI>
auto my_get(TTuple tuple, TI) 
{
    // `TI` needs to be an `std::integral_constant`.
    return std::get<TI{}>(tuple);
}

// `constexpr` variable template.
// `sz_v<0>` is `std::integral_constant<std::size_t, 0>{}`.
template<std::size_t TI>
constexpr std::integral_constant<std::size_t, TI> sz_v{};

// Example call.
// Results in `std::get<0>(some_tuple)`.
my_get(some_tuple, sz_v<0>);

メソッドとして定義すると、次のように呼び出すことができます。

struct some_struct
{ 
    std::tuple<...> some_tuple; 
};

some_struct s;
s.my_get(sz_v<0>);
于 2016-01-09T18:40:30.760 に答える