获取 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
是继承自 T
的 Child
。您甚至可以为非 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>
也可能是外部类型特征。
给出以下 类:
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
是继承自 T
的 Child
。您甚至可以为非 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>
也可能是外部类型特征。