在下面的代碼中,我使用模板函式和型別特征來區分整數型別(其他情況)和陣列型別。我希望輸出分別是int和array,而不是int int通過兩個呼叫分別用 int 型別和陣列型別實體化模板函式:
這是為什么?
#include <iostream>
#include <array>
template <typename T>
inline static void constexpr SetCoordinates()
{
if (std::is_array<T>::value)
std::cout<<"array\n";
else
std::cout<<"int\n";
}
int main()
{
int a = 6;
std::array<int, 4> arr = {1,2,3,4};
SetCoordinates<decltype(a)>();
SetCoordinates<decltype(arr)>();
return 0;
}
uj5u.com熱心網友回復:
std::is_array 不std::array包括; 相反,它只檢查該型別是否只是一個普通的陣列型別(即T[], T[N])。因此,您的if陳述落在了錯誤的分支上。
您必須為此提供自定義特征std::array:
#include <type_traits> // std::true_type, std::false_type, std::is_array
template <typename T> struct is_std_array : std::false_type{};
template < typename T, std::size_t N>
struct is_std_array<std::array<T, N> > : std::true_type { };
template <typename T>
inline static void constexpr SetCoordinates()
{
if (std::is_array<T>::value || is_std_array<T>::value)
// ^^^^^^^^^^^^^^^^^^^^^^^^^-->and check
std::cout << "array\n";
else
std::cout << "int\n";
}
查看演示
uj5u.com熱心網友回復:
在這個簡單的情況下,我可以使用std::is_integral,提供模板函式僅使用這兩種型別呼叫:
#include <iostream>
#include <array>
template <typename T>
inline static void constexpr SetCoordinates()
{
if (std::is_integral<T>::value)
std::cout<<"int\n";
else
std::cout<<"array\n";
}
int main()
{
int a = 6;
std::array<int, 4> arr = {1,2,3,4};
SetCoordinates<decltype(a)>();
SetCoordinates<decltype(arr)>();
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/473681.html
上一篇:自定義模板類的排序向量
