鉴于以下类别:
template <typename T>
class Child : public T {};
我也有一个模板化的功能:
template <typename T>
void foo(const T& bar)
在做了一些模板体操后,我有一段代码确定bar
是某种Child
。但我需要找到 排序。
我希望能够在bar
上进行调用,从而产生继承的类型。所以找到Parent
类型的假句法将是:
decltype(foo.parent) bar;
有没有实际的语法来实现这个目标?
答案 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>
也可以是外部类型特征。