簡體   English   中英

用於復制/轉換對象的一系列功能的模板

[英]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在命名空間stdADL就會啟動並找到std::copy ,這可能會導致非常奇怪的錯誤消息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM