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)