C++11 的标准元组支持通过整数模板参数访问,如下所示:
tuple<int, double> test;
test.get<1>();
但如果我想通过字符串模板参数获得访问权限:
test.get<"first">()
如何实现它?
C++11 的标准元组支持通过整数模板参数访问,如下所示:
tuple<int, double> test;
test.get<1>();
但如果我想通过字符串模板参数获得访问权限:
test.get<"first">()
#include <tuple>
#include <cstring>
constexpr size_t my_cast(const char * text)
{
return !std::strcmp(text, "first") ? 1 :
!std::strcmp(text, "second") ? 2 :
!std::strcmp(text, "third") ? 3 :
!std::strcmp(text, "fourth") ? 4 :
5;
}
int main()
{
std::tuple<int, double> test;
std::get<my_cast("first")>(test);
return 0;
}
这可以在GCC 4.9.2中使用C++11(C++14)编译。在Visual Studio 2015中无法编译。
std::tuple::get
不是成员函数。有一个非成员函数std::get
。std::tuple<int, double> test;
你不能使用以下方式获取第一个元素:
std::get<"first">(test);
你可以使用其他助记符:
const int First = 0;
const int Second = 1;
std::get<First>(test);
std::get<Second>(test);
enum TupleColumns { FIRST, SECOND };
std::get<FIRST>(test);
constexpr TupleColumns f(const char *);
constexpr auto e = f("first");
std::get<e>(test);
在这里我应该加上一个警告:这是一个相当深的兔子洞,需要相当强的C++知识。在更大的视角中,我可能会寻找不同的解决方案,但我不太清楚你的更大的视角,也不知道你的C++水平和同事们的水平(假设你有同事)。
std::get<1>(test)
(好的,在 C++1z 中可能会更改)。其次,您不能像这样为模板参数获取指针。最后,为什么要使用 c 字符串字面值而不是索引? - Jarod42boost::fusion::map
中的type_tags
等更好的选项。 - alfCstd::map
而不是std::tuple
呢?这样你就可以写成test["first"]
。 - mikedu95std::map<std::string, boost::any>
或者std::map<std::string, boost::variant>
。(看一下boost::property_tree
)。 - alfC