来自子类型的 C++ 模板特化

标签 c++

我有一个像这样的类层次结构:

          A<int, int>
          / \
B<int,int>   C<int,int>

还有一类Foo<int, int>有这些类型的成员列表。它们不能组合成一个列表 A因为我需要单独操作它们。无论如何(仅在 C++98 中)添加可以将它们正确插入正确容器的方法,例如:

template<int X, int Y>
class Foo
{
  std::vector< shared_ptr<B<int, int> > > mBs;
  std::vector< shared_ptr<C<int, int> > > mCs;

  template<template <int, int> class T>
  add_element
  {
     mBs.insert(shared_ptr<B<X, Y> >(new B<x, Y>()); if its a B
     mCs.insert(shared_ptr<C<X, Y> >(new C<x, Y>()); if its a C
  }
};

并在客户端代码中执行此操作:

Foo bar;
bar.add_element<TypeDerivedFromB>();
bar.add_element<TypeDerivedFromC>();

我可以有两个不同名称的独立函数,但这会使界面有点难看。谢谢

最佳答案

以下内容可能会有所帮助。 它使用 SFINAE:

template<int X, int Y> class B{};
template<int X, int Y> class C{};

template<int X, int Y>
class Foo
{
  std::vector< std::shared_ptr<B<X, Y> > > mBs;
  std::vector< std::shared_ptr<C<X, Y> > > mCs;

public:
  template<template <int, int> class T>
  typename std::enable_if<std::is_same<T<X, Y>, B<X, Y> >::value>::type
  add_element()
  {
    mBs.push_back(std::shared_ptr<B<X, Y> >(new B<X, Y>));
  }

  template<template <int, int> class T>
  typename std::enable_if<std::is_same<T<X, Y>, C<X, Y> >::value>::type
  add_element()
  {
    mCs.push_back(std::shared_ptr<C<X, Y> >(new C<X, Y>));
  }

};

不确定它是否比 2 个不同名称的方法更好...

关于来自子类型的 C++ 模板特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21065222/

相关文章:

C++从模板函数编译时间数组大小

c++ - 在图像中的一些点周围绘制边界

c++ - void 函数允许返回 "nothing"吗?

c++ - 使用AVRstudi基于ATMega8的计算器

c++ - 多重继承冲突

c++ - 状态机表示

c++ - 这条线想做什么?

c++ - 类范围内的限定名称查找

c++ - 在 C++ 中,我认为你可以做 "string times 2"= string string?

c++ - 将指针传递给常量作为参数时出现问题