我有一个像这样的类层次结构:
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/