获取父类型

时间:2015-07-15 11:38:39

标签: c++ inheritance types parent decltype

鉴于以下类别:

template <typename T>
class Child : public T {};

我也有一个模板化的功能:

template <typename T>
void foo(const T& bar)

在做了一些模板体操后,我有一段代码确定bar是某种Child。但我需要找到 排序。

我希望能够在bar上进行调用,从而产生继承的类型。所以找到Parent类型的假句法将是:

decltype(foo.parent) bar;

有没有实际的语法来实现这个目标?

2 个答案:

答案 0 :(得分:1)

只需将类型作为参数:

template <typename T>
void foo(const Child<T>& bar) {

}

bar是继承自Child的{​​{1}}。您甚至可以为非T添加单独的重载:

Child

答案 1 :(得分:1)

根据OP的要求,以下是我评论的扩展版本:

如果Child及其兄弟姐妹在您的控制之下,处理此问题的一种常见方法是向其添加嵌套类型:

template<typename T> class Child : public T 
{
public:
   using parent = T;
};

template<typename T> void foo(const T& bar)
{
   typename T::parent goo;
}

如果T不能直接使用(例如,在lambda中),那么这应该有效:

auto foo2 = [](const auto& bar)
{
   typename std::remove_reference_t<decltype(bar)>::parent goo;
};

要使它更好更短,

template<typename T> using parent = typename T::parent;

template<typename T> void foo(const T& bar)
{
   parent<T> goo;
}

auto foo2 = [](const auto& bar)
{
   parent<std::remove_reference_t<decltype(bar)>> goo;
};

(虽然parent是一个相对常见的名称;请注意冲突。parent_t,也许?)

对于不受您控制的类型,如果已知类型集,parent<T>也可以是外部类型特征。