首页 > 解决方案 > 将可变参数模板扩展为静态成员数组

问题描述

我定义了一个基类模板:

template<class actual_class>
class base
{
public:
    static const int value;
}

的定义value取决于actual_classtparam。

接下来,我有一堆来自 的派生类base,我们称它们为ab。让我们也这么说a::value = 5b::value = 10

现在,在我需要从参数包访问静态值的方法模板中。我想把它们放在一个向量中。

template<class... derived_from_bases>
void foo(irrelevant_class<derived_from_bases...> irrelevant)
{
    // std::vector<int> values = { ... }
    ...
}

对于用 < a, b > tparams 调用的函数,我希望值向量看起来像这样:

std::vector<int> values = {5 /* a::value */, 10 /* b::value */};

也有一个 std::array 而不是一个 std::vector 将是一个不错的选择。

提前谢谢你的帮助。

标签: c++templatesvariadic-templates

解决方案


对于向量,您只需要

std::vector<int> values = { derived_from_bases::value... };

如果你有 C++17,你可以std::array

std::array values = { derived_from_bases::value... };

CTAD会为你推断出数组的类型和大小如果你没有 C++17,那么你可以使用

std::array<int, sizeof...(derived_from_bases)> values = { derived_from_bases::value... };

推荐阅读