C++ 获取父级的类型

C++ 获取父级的类型,c++,inheritance,types,parent,decltype,C++,Inheritance,Types,Parent,Decltype,鉴于以下类别: template <typename T> class Child : public T {}; 有什么实际的语法可以实现这一点吗?只需将类型作为参数: template <typename T> void foo(const Child<T>& bar) { } 根据OP的要求,以下是我上述评论的扩展版本: 如果Child及其同级在您的控制下,处理此问题的一种常见方法是向它们添加嵌套类型: template<typenam

鉴于以下类别:

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

有什么实际的语法可以实现这一点吗?

只需将类型作为参数:

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

}

根据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;
}
为了让它稍微好一点和短一点

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=typename T::parent的模板; 模板无效foo(常数T和bar) { 母粘; } 自动foo2=[](常量自动和条形) { 母粘; }; (虽然
parent
是一个相对常见的名称,但要小心冲突。
parent\u t
,也许吧?)


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

如果child同时从parent1和parent2继承,您能描述一下通过这样的声明您试图实现的目标吗?这可能有助于为你提供更多关于如何做这类事情的指导。。。。如果它是
Child:Parent:Grandparent
?或std::is_base_of+std::is_sameSince
Child
,并且它的兄弟姐妹似乎在您的控制之下,您不能使用Parent=t向它们添加嵌套类型吗?然后,在
foo
中,使用
typename T::parent
。或者,
typename std::remove\u reference\u t::parent
。是的,这是我最初拥有的,但我需要该函数能够接受其他类型,而不仅仅是
子类型。(我知道这件事需要重写,但在我能做到这一点之前;)除了接受类型作为函数参数之外,还有什么可以做的吗?@JonathanMee这就是重载的目的。否则,请明确您想要做什么,以便您想要一个需要
Child
中的
T
并适用于非Child的函数。是的,这可能是正确的解决方案。在我接受之前我会坚持一段时间,希望有人有其他的魔法。
template <typename NonChild>
void foo(const NonChild& baz) { }
template<typename T> class Child : public T 
{
public:
   using parent = T;
};

template<typename T> void foo(const T& bar)
{
   typename T::parent goo;
}
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;
};