![](/img/trans.png)
[英]How to pass a template type (std::array or std::vector) to a template parameter
[英]How to pass a std::array to a function template which can accept std::vector
我正在嘗試編寫一個模板,它可以接受一些序列容器:
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()
無法編譯。 顯然,沒有這樣的事情。
是否可以制作這樣一個模板 function,它可以處理std::vector
和std::array
?
如果您想限制您的模板僅適用於std::array
或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();
}
如果您實例化一個數組並獲取它的大小(即 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();
}
如果值類型的默認初始化很昂貴,這當然會出現問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.