C++11 对具有枚举值的元组项的编译时访问

C++11 对具有枚举值的元组项的编译时访问,c++11,visual-studio-2013,tuples,decltype,trailing-return-type,C++11,Visual Studio 2013,Tuples,Decltype,Trailing Return Type,我想使用枚举值作为索引来访问元组项。我读这篇文章是想有所帮助。 我在VS2013中工作,因此我无法使用C++14非常方便的auto,如果没有trailing return 静态cast可以工作,但它很麻烦,还需要自由访问tuple(在实际代码中,属性在保护范围内)。 我想通过使用模板化方法GetAttribute 我尝试了这个,但它产生了一个错误: prog.cpp:30:119:错误:类型为“”和“size_t{aka unsigned int}”到binary”运算符的操作数无效恐怕没有很好

我想使用枚举值作为索引来访问元组项。我读这篇文章是想有所帮助。
我在VS2013中工作,因此我无法使用C++14非常方便的
auto
,如果没有
trailing return

静态cast可以工作,但它很麻烦,还需要自由访问tuple(在实际代码中,属性在
保护范围内)。
我想通过使用模板化方法
GetAttribute

我尝试了这个,但它产生了一个错误:


prog.cpp:30:119:错误:类型为“”和“size_t{aka unsigned int}”到binary”运算符的操作数无效恐怕没有很好的解决方案

丑陋的变型-在呼叫站点播放 实现类似功能的最简单方法是将值作为非类型模板参数传递:

template <size_t attributeName>
auto GetAttribute() -> decltype(std::get<attributeName>(attributes))
{
    return std::get<attributeName>(attributes);
}
在这种情况下,定义
GetAttribute
有很多样板代码,因此您可能希望将其隐藏在宏后面:

#define DEFINE_GetAttribute(ENUM_TYPE, TUPLE_TYPE)                             \
  template <ENUM_TYPE attributeName>                                           \
  auto GetAttribute(TUPLE_TYPE &tuple)                                         \
      ->decltype(std::get<static_cast<size_t>(attributeName)>(tuple)) {        \
    return std::get<static_cast<size_t>(attributeName)>(tuple);                \
  }

DEFINE_GetAttribute(XParameters, XTuple)
#定义获取属性(枚举类型、元组类型)\
模板\
自动获取属性(元组类型和元组)\
->decltype(std::get(tuple)){\
返回std::get(元组)\
}
定义_GetAttribute(XParameters,Xtple)

恐怕没有什么好办法了

丑陋的变型-在呼叫站点播放 实现类似功能的最简单方法是将值作为非类型模板参数传递:

template <size_t attributeName>
auto GetAttribute() -> decltype(std::get<attributeName>(attributes))
{
    return std::get<attributeName>(attributes);
}
在这种情况下,定义
GetAttribute
有很多样板代码,因此您可能希望将其隐藏在宏后面:

#define DEFINE_GetAttribute(ENUM_TYPE, TUPLE_TYPE)                             \
  template <ENUM_TYPE attributeName>                                           \
  auto GetAttribute(TUPLE_TYPE &tuple)                                         \
      ->decltype(std::get<static_cast<size_t>(attributeName)>(tuple)) {        \
    return std::get<static_cast<size_t>(attributeName)>(tuple);                \
  }

DEFINE_GetAttribute(XParameters, XTuple)
#定义获取属性(枚举类型、元组类型)\
模板\
自动获取属性(元组类型和元组)\
->decltype(std::get(tuple)){\
返回std::get(元组)\
}
定义_GetAttribute(XParameters,Xtple)

编译器应该如何将运行时值
attributeName
转换为
static\u cast
std::get
的模板参数的编译时值?
attributeName
值在编译时已知,它等于
x.GetAttribute(XParameters::PARAMETER1)的
XParameters::PARAMETER1
指令。编译时在调用站点知道它,但它是一个正常的函数调用,因此在
GetAttribute
函数中它是一个运行时参数。如果可用,您可以使用
static_assert(XParameters::PARAMETER1==attributeName,”)测试它
应该告诉您,
attributeName
不是编译时值。您有什么建议来解决这个问题吗?顺便问一下:为什么在decltype中使用declval?
struct Common
的用途是什么?(使用自由函数和原始
std::tuple
s可以实现同样的效果)编译器应该如何将运行时值
attributeName
转换为
std::get
static\u cast
模板参数的编译时值?
attributeName
值在编译时已知,对于
x.GetAttribute(XParameters::PARAMETER1),它等于
XParameters::PARAMETER1
指令。编译时在调用站点知道它,但它是一个正常的函数调用,因此在
GetAttribute
函数中它是一个运行时参数。如果可用,您可以使用
static_assert(XParameters::PARAMETER1==attributeName,”)测试它
应该告诉您,
attributeName
不是编译时值。您有什么建议来解决这个问题吗?顺便问一下:为什么在decltype中使用declval?
struct Common
的用途是什么?(您可以通过自由函数和原始
std::tuple
s实现相同的功能)
struct X : Common<XTuple, XParameters>
{
    X() : Common(std::make_tuple(42, 3.14f)) {}
};

x.GetAttribute<XParameters::PARAMETER1>();
template <XParameters attributeName>
auto GetAttribute(XTuple &tuple) -> decltype(std::get<static_cast<size_t>(attributeName)>(tuple) )
{
    return  std::get<static_cast<size_t>(attributeName)>(tuple);
}

GetAttribute<XParameters::PARAMETER1>(x.attributes);
#define DEFINE_GetAttribute(ENUM_TYPE, TUPLE_TYPE)                             \
  template <ENUM_TYPE attributeName>                                           \
  auto GetAttribute(TUPLE_TYPE &tuple)                                         \
      ->decltype(std::get<static_cast<size_t>(attributeName)>(tuple)) {        \
    return std::get<static_cast<size_t>(attributeName)>(tuple);                \
  }

DEFINE_GetAttribute(XParameters, XTuple)