我想要一個回傳一些初始化的模板函式。
我做了以下事情:
#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 但在陣列的情況下我得到錯誤
標量物件“arr”在初始化程式中需要一個元素
我應該如何初始化并回傳陣列?
uj5u.com熱心網友回復:
問題是,當T = int您嘗試使用分支中的int arr初始化程式串列進行初始化時。即使你不執行分支,編譯器仍然要編譯它并且是無效的語法。{1, 2, 3, 4}elseelseint 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,編譯器else在T是整數型別(例如int)時不會編譯if分支,并且在T不是整數型別時不會編譯分支。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/472571.html
