获取 Parent 的类型

Get the Type of a Parent

给出以下 类:

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

我还有一个模板化函数:

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

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

我希望能够调用 bar 产生继承的类型。因此,查找 Parent 类型的假语法为:

decltype(foo.parent) bar;

是否有任何实际的语法来完成此操作?

只需将类型作为参数即可:

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

}

bar 是继承自 TChild。您甚至可以为非 Child:

添加单独的重载
template <typename NonChild>
void foo(const NonChild& baz) { }

应 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> 也可能是外部类型特征。