1

C++14 Wikipedia 页面描述了按类型寻址的元组的新语言特性,您可以使用它编写:

tuple<string, string, int> t("foo", "bar", 7);
int i = get<int>(t);        // i == 7

好吧,一般来说,这会失败,即在一般情况下,一个元组具有多个相同类型的元素。这是一种非常特殊(尽管我承认很常见)的元组,每种类型都有一个值;并且这种 get 类型暗示​​了get<T>(t)某种 的T-representation的语义t,就好像不同类型中的值在某种程度上是相关的。

为什么有这样一个方法是个好主意,它不适用于一般情况,并且似乎与某些相关,好吧,我猜你可以说元组的子类?

4

1 回答 1

6

我认为主要动机是std::tuple按位置寻址不是很易读,也不是很健壮;从理由

假设我们有一个函数 get_employee_info 以元组的形式返回一些员工信息。说诸如 get<2>(get_employee_info(...) 之类的内容并不能真正表明我们正在寻找员工的办公室。此外,如果我们稍后对返回另一个员工属性感兴趣,我们可能需要调整索引整个节目。

当然,这只能对独特的类型进行。但是,可以使用例如枚举类、轻量级包装器等std::string,以使这些更易于阅读和维护。

这是一个简单的例子:

#include <tuple>
#include <string>
#include <iostream>

struct FirstName : std::string { using std::string::basic_string; };
struct LastName : std::string { using std::string::basic_string; };

struct EmployeeID
{
    EmployeeID(int id) : employeeID_m(id) { }
    operator int() const { return employeeID_m; }
    const EmployeeID &operator=(int id) { employeeID_m = id; return *this; }
    int employeeID_m;
};

using Record = std::tuple<FirstName, LastName, EmployeeID>;

void printRecord(const Record &r)
{
    std::cout << std::get<FirstName>(r) << " "
        << std::get<LastName>(r)
        << "'s employee ID is "
        << std::get<EmployeeID>(r)
        << std::endl;
}

int main() {

    Record record1 = std::make_tuple(FirstName("Slim"), LastName("Jim"), EmployeeID(12233));
    Record record2 = std::make_tuple(FirstName("Big"), LastName("Bill"), EmployeeID(33221));

    printRecord(record1);
    printRecord(record2);

    return 0;
}

带输出:

Slim Jim's employee ID is 12233
Big Bill's employee ID is 33221
于 2015-04-18T16:21:14.703 回答