给定以下类别:
template <typename T>
class Child : public T {};
我还有一个模板函数:
template <typename T>
void foo(const T& bar)
在进行了一些模板体操之后,我有一段代码确定了bar是某种Child.但是我需要找到什么样的东西.
我希望能够对产生继承类型的bar进行调用.因此,查找父类型的虚假语法为:
decltype(foo.parent) 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;
}
如果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>也可能是外部类型特征.