如何在模板函数中初始化和 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
分支,并且不会编译if
当 T
不是整数类型时分支。
我想要一个 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
分支,并且不会编译if
当 T
不是整数类型时分支。