我正在嘗試撰寫一個模板,它可以接受一些序列容器:
template <typename S,
typename = std::enable_if_t<
std::is_same<S, std::array<typename S::value_type>, S::size()>::value ||
std::is_same<S, std::vector<typename S::value_type>>::value>>
std::string arr2String(const S& seqContainer) {
std::stringstream res;
for (const auto& element : seqContainer) {
res << element << "|";
}
return res.str();
}
但是,由于S::size(). 顯然,沒有這樣的事情。
是否可以制作這樣一個模板函式,它可以處理std::vector和std::array?
uj5u.com熱心網友回復:
如果您想限制您的模板僅適用于std::arrayor std::vector,您可以撰寫一些輔助特征
template <typename>
struct is_array : std::false_type {}
template <typename T, std::size_t N>
struct is_array<std::array<T, N>> : std::true_type {}
template <typename>
struct is_vector : std::false_type {}
template <typename... Ts>
struct is_vector<std::vector<Ts...>> : std::true_type {}
template <typename S,
typename = std::enable_if_t<
is_array<S>::value ||
is_vector<S>::value>>
std::string arr2String(const S& seqContainer) {
std::stringstream res;
for (const auto& element : seqContainer) {
res << element << "|";
}
return res.str();
}
否則你可以 SFINAE 更一般的東西
template <typename S, typename = typename S::value_type>
std::string arr2String(const S& seqContainer) {
std::stringstream res;
for (const auto& element : seqContainer) {
res << element << "|";
}
return res.str();
}
uj5u.com熱心網友回復:
如果您實體化一個陣列并獲取其大小(constexpr),您的代碼實際上可以被編譯。
template <typename S,
typename = std::enable_if_t<
std::is_same<S, std::array<typename S::value_type, S{}.size()>>::value ||
std::is_same<S, std::vector<typename S::value_type>>::value>>
std::string arr2String(const S& seqContainer) {
std::stringstream res;
for (const auto& element : seqContainer) {
res << element << "|";
}
return res.str();
}
如果您的值型別的默認初始化很昂貴,這當然會有問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/358919.html
