C++ 使用部分模板专门化选择基类

C++ 使用部分模板专门化选择基类,c++,templates,c++11,C++,Templates,C++11,我不熟悉下面要使用的一些高级模板技术,所以我怀疑我的术语可能不太正确。我有一个Box基类型和几个继承自Box的类。我试图基于模板参数构造一个特定子类的实例 这是框类型。Convert函数可以使用返回U类型的函数创建一个新的框 template<typename T> class Box : public std::enable_shared_from_this<Box<T>> { public: // Box<T> --> Box&l

我不熟悉下面要使用的一些高级模板技术,所以我怀疑我的术语可能不太正确。我有一个
Box
基类型和几个继承自
Box
的类。我试图基于模板参数构造一个特定子类的实例

这是
类型。
Convert
函数可以使用返回U类型的函数创建一个新的

template<typename T>
class Box : public std::enable_shared_from_this<Box<T>> {
 public:

  // Box<T> --> Box<U>
  template <typename Func>
  auto Convert(Func f) -> std::shared_ptr<Box<decltype(f(std::declval<T>()))>>;

  virtual void Print() {
    std::cout << "box" << std::endl;
  }
};
方法来构造子类实例

// implementation of convert
template <typename T>
template <typename Func>
auto Box<T>::Convert(Func f) -> std::shared_ptr<Box<decltype(f(std::declval<T>()))>>
{
    using ReturnType = decltype(f(std::declval<T>()));
    auto p = new ConvertedBox<ReturnType, T, Func>(this->shared_from_this(), f);
    return std::shared_ptr<Box<ReturnType>>(p);
}
我希望能够根据应用的函数类型专门化
基类。例如,如果我像这样转换到
Box

auto converted_pair_box = box->Convert([](int v) -> std::pair<int, int> {
  return std::make_pair(v, v);
});
我曾尝试在
std::pair
上专门化
Box
,但没有成功

template<typename K, typename V>
class PairBox : public Box<std::pair<K, V>> {
 public:
  void PairOnlyPrint() {
    std::cout << "only pair box" << std::endl;
  };
};
模板
类PairBox:公共框{
公众:
void PairOnlyPrint(){

std::cout您的
类PairBox
不是专门化,专门化应该是:

template<typename K, typename V>
class Box<std::pair<K, V>>: public std::enable_shared_from_this<Box<std::pair<K, V>>> {
 public:

  // Box<T> --> Box<U>
  template <typename Func>
  auto Convert(Func f)
  -> std::shared_ptr<Box<decltype(f(std::declval<std::pair<K, V>>()))>>;

  virtual void Print() { std::cout << "pair box" << std::endl; }
  void PairOnlyPrint() { std::cout << "only pair box" << std::endl; };
};
模板
类框:public std::从\u中启用\u共享\u{
公众:
//框-->框
模板
自动转换(Func f)
->std::共享的ptr;

virtual void Print(){std::cout
Convert
返回一个
Box
,因此您得到的是一个
Box
而不是一个
PairBox
。您可以做的是将派生类作为模板参数传递给基类(
Box
)。尽管这假设
Convert
不是一个真正的自由函数(示例中没有)。是的,我应该提到我知道这是一个问题。一般来说,我在这一点上陷入了困境,试图在
Convert
函数中使用感觉像“if”语句的语句。您建议的是CRTP?是的,该建议将使用CRTP。不过,您也可以将模板参数添加到
Convert
中。谢谢e通过我最初的障碍,因此打印语句可以正常工作。我注意到,我添加到框中的任何通用接口都必须在std::pair专门化中复制。有没有办法实现这一点?通过一些相关问题,使用此继承属性的模板专门化似乎是可能的。只是不太确定是什么我举我的例子。
converted_pair_box->PairOnlyPrint();
template<typename K, typename V>
class PairBox : public Box<std::pair<K, V>> {
 public:
  void PairOnlyPrint() {
    std::cout << "only pair box" << std::endl;
  };
};
template<typename K, typename V>
class Box<std::pair<K, V>>: public std::enable_shared_from_this<Box<std::pair<K, V>>> {
 public:

  // Box<T> --> Box<U>
  template <typename Func>
  auto Convert(Func f)
  -> std::shared_ptr<Box<decltype(f(std::declval<std::pair<K, V>>()))>>;

  virtual void Print() { std::cout << "pair box" << std::endl; }
  void PairOnlyPrint() { std::cout << "only pair box" << std::endl; };
};