如何使用std :: array构造函数自变量C ++

时间:2018-11-27 03:50:52

标签: c++ constructor const stdarray list-initialization

假设我们在C ++ 11或更高版本中具有以下类:

class MyClass {
private:
    const std::array<SomeType, 100> myArray;
public:
    explicit MyClass(std::array<SomeOtherType, 100> initArray);
};

假设类SomeType具有一个采用单个SomeOtherType作为参数的构造函数,是否可以在构造函数中使用列表初始化来初始化const成员数组?这样做的语法是什么?

很明显,像这样直接初始化它是行不通的:

MyClass::MyClass(std::array<SomeOtherType, 100> initArray) :
    myArray{initArray} {}

谢谢!

3 个答案:

答案 0 :(得分:4)

您可以使用可变参数模板:

#include <array>

struct foo
{
    const std::array<int, 10> bar;

    template<typename... T>
    foo(T&&... t)
    : bar({ std::move(t)... })
    {}
};

int main()
{
    foo f{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
}

或者您可以使用传递给构造函数的数组对其进行初始化:

#include <array>

struct foo
{
    const std::array<int, 10> bar;

    explicit foo(std::array<int, 10> const &qux)
    : bar{ qux }
    {}
};

int main()
{
    std::array<int, 10> qux;
    foo f(qux);
}

但是这些选项没有考虑到您希望将SomeOtherType的数组转换为SomeType的数组。起初我没有意识到,请注意上面的变体。

#include <cstddef>
#include <array>
#include <utility>

struct SomeOtherType{};

struct SomeType {
    SomeType(SomeOtherType) {}
};

struct MyClass
{
    const std::array<SomeType, 100> myArray;

    template<typename T, std::size_t... N>
    MyClass(T&& qux, std::index_sequence<N...>)
    : myArray{ qux[N]... }
    {}

    explicit MyClass(std::array<SomeOtherType, 100> const &qux)
    : MyClass{ qux, std::make_index_sequence<100>{} }
    {}
};

int main()
{
    std::array<SomeOtherType, 100> qux{};
    MyClass foo(qux);
}

答案 1 :(得分:1)

您可以使用template<typename Arr, size_t... Is> MyClass(Arr&& arr, std::index_sequence<Is...>) : myArray{arr[Is]...} () explicit MyClass(std::array<SomeOtherType, 100> arr) : MyClass(arr, std::make_index_sequence<100>{}) () 解压缩参数并委托构造函数

Foundation

答案 2 :(得分:0)

这是可能的。您只需要一个辅助函数模板即可为您进行转换。像这样:

@autojit