【问题标题】:C++14 Create vector from variadic templatesC++14 从可变参数模板创建向量
【发布时间】:2018-12-17 11:22:34
【问题描述】:

假设,我有一个结构

struct A
{
   std::string name;
};

并想编写从对象中读取字段“名称”并返回它们的函数 作为std::vector<std::string>。 是否可以通过可变参数模板(或任何非迭代方法)来做到这一点。 我的目标是这样的:

template<typename... Ts>
std::vector<std::string> function(Ts... ts)
{
    ...
}

在程序中:

    A a1, a2, a3, a4;
    function(a1, a2, a3, a4);

输出:{a1.name, a2.name, a3.name, a4.name}

【问题讨论】:

    标签: c++ templates c++14 variadic-templates


    【解决方案1】:

    一个在 C++11 中工作的非常简单的扩展:

    template <typename ... Ts>
    std::vector<std::string> function(Ts&& ... ts)
    {
        return {std::forward<Ts>(ts).name...};
    }
    

    (不需要转发引用)

    实际情况是,向​​量是用initializer list, constructed from the variadic parameter pack 构造的,而applying a function(成员访问运算符)用于每个可变参数元素。

    【讨论】:

    • 完美转发在这里有效吗?在function(std::move(a1)); 的情况下,a1 将被视为右值,但它的name 成员变量将是左值。或者,不会?
    • 抱歉,刚刚发现成员变量也是右值(stackoverflow.com/a/8609226/580083)。不知道这个规则。
    • @DanielLangr 老实说,你让我怀疑,所以谢谢你的链接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-04
    • 2014-10-14
    相关资源
    最近更新 更多