如何在模板函数中初始化和 return 一个 std::array?

How to initialise and return an std::array within a template function?

我想要一个 return 一些初始化的模板函数。

我做了以下事情:

#include<iostream>
#include<array>

template <typename T>
inline static constexpr T  SetValues()
{
    if(std::is_integral<T>::value)
    {
      std::cout<<"int\n";
      return T{1};
    }
    else
    {
      std::cout<<"array\n";
      T arr = {1,2,3,4};
      return arr;
    }
}


int main()
{
 int a = 6;
 std::array<int, 4> arr = {2,2,2,2};
 a = SetValues<decltype(a)>();
 arr = SetValues<decltype(arr)>();
 return 0;
}

它正确地初始化了 int 但在数组的情况下我得到了错误

scalar object ‘arr’ requires one element in initializer

我应该如何初始化和 return 数组?

问题是,当 T = int 时,您正试图在 else 分支中使用初始化程序列表 {1, 2, 3, 4} 初始化 int arr。即使你不执行 else 分支,编译器仍然要编译它并且 int arr = {1, 2, 3, 4} 是无效语法。

在 C++17(及更高版本)上,您可以使用 if constexpr:

template <typename T>
inline static constexpr T SetValues() {
    if constexpr (std::is_integral<T>::value) {
        std::cout << "int\n";
        return T{1};
    } else {
        std::cout << "array\n";
        T arr = {1, 2, 3, 4};
        return arr;
    }
}

使用if constexpr,当T是整数类型(例如int)时,编译器不会编译else分支,并且不会编译ifT 不是整数类型时分支。