在C++ 17中,如何使用花括号初始化器初始化类对象,并将数组引用作为模板参数传递给构造函数?

qhhrdooz  于 2023-07-01  发布在  其他
关注(0)|答案(2)|浏览(94)

我有一个模板类,想在它的构造函数中传递一个对数组的引用,使用花括号初始化器。

template<typename T, size_t ar_sz> class Test_class {
    // Thats incorrect
    /*
    T t;
    size_t size;
    */
    
    // Thats correct?
    T array[ar_sz];
public:

    Test_class(const T (&array)[ar_sz]) {
    }

};

int main() {
  
    constexpr size_t array_sz = 1;
    int ar_i[array_sz]{ 1 };

    Test_class test_ar{ ar_i };

}

那么,如何正确地做到这一点呢?
编辑:
我想补充的是,我需要将L"test"传递给一个构造函数,它是一个const wchar_t[5],所以这个任务不能用std::array<>来解决。

qojgxg4l

qojgxg4l1#

编译器推导出T = intar_sz = 1。在模板中,声明T t;的含义与int t;相同。你不想这样的!你想要T t[ar_sz];。顺便说一句,为了减少混淆,使用大于1的数组大小。
另一个问题是(正如其他人所指出的):你不能用另一个数组初始化一个数组。你需要明确的复制。

#include <iostream>
#include <algorithm>

template<typename T, size_t size> 
struct Test
{
public:
    T m_values[size]; // array, not element (you could also use std::array)

    Test(const T (&values)[size])
    {
        std::copy(values, values + size, m_values); // explicit copying (you could also use memcpy)
    }

    const auto& values() const noexcept
    {
        return m_values;
    }
};

int main() 
{
    Test test("meh");

    std::cout << test.values()[1] << '\n';
    std::cout << test.values()[2] << '\n';
    return 0;
}
8yparm6h

8yparm6h2#

使用std::array作为已经建议的,同样当初始化时,你需要一对额外的{}来传递值。

#include <array>
#include <iostream>

template<typename T, size_t ar_sz> 
class Test_class 
{
public:
    Test_class(const std::array<T,ar_sz>& values) : 
        m_values{ values } 
    {
    }

    const auto& values() const noexcept
    {
        return m_values;
    }

private:
    std::array<T, ar_sz> m_values;

};

int main() 
{
    std::array values{ 1,2,3 };
    Test_class test_ar{ values };     

    std::cout << test_ar.values()[2];
    return 0;
}

相关问题