Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过字符串模板参数访问元组 C++中的标准元组允许这样的整数模板PARAM访问: tuple<int, double> test; test.get<1>(); tuple检验; test.get();_C++_Templates_C++11_Variadic Templates - Fatal编程技术网

通过字符串模板参数访问元组 C++中的标准元组允许这样的整数模板PARAM访问: tuple<int, double> test; test.get<1>(); tuple检验; test.get();

通过字符串模板参数访问元组 C++中的标准元组允许这样的整数模板PARAM访问: tuple<int, double> test; test.get<1>(); tuple检验; test.get();,c++,templates,c++11,variadic-templates,C++,Templates,C++11,Variadic Templates,但如果我想通过字符串模板参数获得访问权限: test.get<"first">() test.get() 如何实现它?首先,std::tuple::get不是成员函数。有一个非成员函数 鉴于 std::tuple<int, double> test; std::元组测试; 无法使用以下命令获取第一个元素: std::get<"first">(test); std::get(测试); 您可以使用其他助记符: const int First = 0;

但如果我想通过字符串模板参数获得访问权限:

test.get<"first">()
test.get()

如何实现它?

首先,
std::tuple::get
不是成员函数。有一个非成员函数

鉴于

std::tuple<int, double> test;
std::元组测试;
无法使用以下命令获取第一个元素:

std::get<"first">(test);
std::get(测试);
您可以使用其他助记符:

const int First = 0;
const int Second = 1;
std::get<First>(test);
std::get<Second>(test);
const int First=0;
常数int秒=1;
标准:get(测试);
标准:get(测试);

如果这能让代码更具可读性的话。

R Sahu提供了一些很好的助记符,不过我想再添加一个。您可以使用C样式枚举(即非类枚举):

enum TupleColumns{FIRST,SECOND};
标准:get(测试);
如果将枚举与智能枚举反射库(如:)相结合,则可以创建一组枚举,这些枚举可以与字符串进行自动转换。因此,您可以自动将列名转换为枚举,并通过这种方式访问元组

所有这些都要求您在编译时提交列名和顺序。此外,您将始终需要使用字符串文本或constexpr函数,以便可以将枚举值作为constexpr来使用

constexpr TupleColumns f(const char *);
constexpr auto e = f("first");
std::get<e>(test);
constexpr TupleColumns f(const char*);
constexpr auto e=f(“第一”);
标准:get(测试);

我应该在这一点上添加一个警告:这是一个相当深的兔子洞,需要相当强的C++。我可能会在更大的图片中寻找不同的解决方案,但是我不太了解你的大图片,我也不知道你的C++和你的同事(假设你有它们)。我只是想证明OP想要的(几乎)是可能的

#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;
}
#包括
#包括
constexpr size\u t my\u cast(const char*text)
{
return!std::strcmp(文本“第一”)?1:
!std::strcmp(文本,“秒”)?2:
!std::strcmp(文本,“第三”)?3:
!std::strcmp(文本,“第四”)?4:
5.
}
int main()
{
标准:元组检验;
标准:get(测试);
返回0;
}

这可以使用GCC4.9.2中的C++11(C++14)进行编译。不在Visual Studio 2015中编译。

首先,它是
std::get(test)
(好的,在C++1z中可能会更改)。其次,不能将这样的指针作为模板参数。最后,为什么要使用c字符串文字而不是索引?如果要使用运行时字符串,这是不可能的。如果您想要一个静态字符串,有更好的选择,可以使用类型标记,如
boost::fusion::map
。在下一步中,我想为数据库协处理器实现relationships类。列在数据库表中称为字符串名。@COUNTERKILL那么为什么不使用
std::map
而不是
std::tuple
?这将允许您编写
test[“first”]
。否。数据库中的列可以具有不同的类型。如果我要使用std::map,我不能对所有列都有相同的访问权限。
#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;
}