正如 NathanOlivier 所解释的,get<type>(tupleValue) 是 C++14 功能。
如果您使用 C++11 编译器,解决方案可以是编写类型特征来选择列表中类型的索引。
举例
template <typename T, typename T0, typename ... Ts>
struct getI
{ static constexpr std::size_t value { 1U + getI<T, Ts...>::value }; };
template <typename T, typename ... Ts>
struct getI<T, T, Ts...>
{ static constexpr std::size_t value { 0U }; };
所以你可以写你的getMap<type>()方法如下
template <typename T>
MapType<T> & getMap ()
{ return std::get<getI<T, ValueTypes...>::value>(member_tuple); }
template <typename T>
MapType<T> const & getMap () const
{ return std::get<getI<T, ValueTypes...>::value>(member_tuple); }
以下是一个完整的工作示例
#include <map>
#include <tuple>
#include <iostream>
template <typename T, typename T0, typename ... Ts>
struct getI
{ static constexpr std::size_t value { 1U + getI<T, Ts...>::value }; };
template <typename T, typename ... Ts>
struct getI<T, T, Ts...>
{ static constexpr std::size_t value { 0U }; };
template <typename KeyType, typename ... ValueTypes>
struct TupleMaps
{
template<typename T>
using MapType = std::map<KeyType, T>;
std::tuple<MapType<ValueTypes>...> member_tuple;
template <typename T>
MapType<T> & getMap ()
{ return std::get<getI<T, ValueTypes...>::value>(member_tuple); }
template <typename T>
MapType<T> const & getMap () const
{ return std::get<getI<T, ValueTypes...>::value>(member_tuple); }
};
int main ()
{
TupleMaps<int, float, std::string> maps;
std::cout << maps.getMap<float>().size() << std::endl; // print 0
maps.getMap<float>()[3] = 7.5;
std::cout << maps.getMap<float>().size() << std::endl; // print 1
}