[英]Template for a family of functions designed to copy/convert objects
我想寫一個名為copy
的復制/轉換函數族,它從對象A copy
到對象B。例如
void f(const A& a) {
B b = copy<B>(a);
...
}
例如,A可以是std::array<double, 5>
而B可以是std::vector<double>
。
是否有可能做這樣的事情並一次定義從任何std::array<T, n>
為std::vector<T>
的專業化? 在另一個文件中,我還想一次定義從任何std::array<T, n>
為CudaVector<T>
。 在另一個文件中,我想定義從SparseMatrix<T>
到DenseMatrix<T>
,等等。
如果您沒有找到任何解決方案,只要我仍然具有值語義(我不想定義copy(const A& input, B& output)
),您是否會考慮采取任何類似的方法。
由於模板參數的推導,這當然是可能的。 可以從參數推導出from類型,需要明確聲明返回類型。
還有另一個問題,就是如果計划要具有將各種容器轉換為其他各種容器的專業化功能,則需要部分功能專業化功能,這是不允許的。 但是,通常的技巧可以通過使用類的部分專業化來解決。
例如,這可以用作通用模板,並且可以專門用於將std::array
復制轉換為相同元素類型的std::vector
:
template<typename B, typename A>
struct copier {
//static B copy(const A&); // Is there a generic fall-back algorithm? Probably not.
};
template<typename T, size_t N>
struct copier<std::vector<int>, std::array<T, N>> {
static std::vector<int> copy(const std::array<T, N>& a) {
std::vector<int> b{};
std::copy(a.begin(), a.end(), std::back_inserter(b));
return b;
}
};
template<typename B, typename A>
B mcopy(const A& a) {
return copier<B, A>::copy(a);
}
然后您可以使用
std::array<int, 3> a{1, 2, 3};
using B = std::vector<int>;
B b = mcopy<B>(a);
看起來就像您的問題所在。
請注意, copy
不是此功能的很好稱呼。 只要類型A
在命名空間std
, ADL就會啟動並找到std::copy
,這可能會導致非常奇怪的錯誤消息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.