当前位置: 首页 > 知识库问答 >
问题:

如何在编译时推断嵌套std::vector的内部类型?

费明诚
2023-03-14

前几天我问了一个关于嵌套向量的非常类似的问题,但我遇到了另一个让我难堪的问题。我需要在编译时获取嵌套向量的最内层类型,以便将其作为模板参数传递。

例如,如果我有这个嵌套向量:

std::vector<std::vector<std::vector<int>>> v;

我需要一种方法来提取int,这样我就可以调用一个函数,它需要一个嵌套的向量,并对这样的元素工作:

foo<int>(v);

除了catch之外,这个函数应该能够处理包含任何类型的任何深度的嵌套向量。当我调用foo时,我希望自动为我推导出内部类型。

所以也许电话看起来像这样:

foo<inner_type_t<v>>(v);

其中,internal\u type\u t是某种形式的递归模板,在给定v时解析为int

我想这个问题的解决方案和另一个问题的类似,但我还没能解决。。。对于递归模板,我还是个新手。

这是我到目前为止所拥有的。。。

template <typename T>
struct inner_type
{
    using type = T;
};

template <typename T>
struct inner_type<std::vector<T>>
{
    using type = inner_type<T>;
};

int main()
{
    std::vector<std::vector<int>> v  = {
        { 1, 2}, {3, 4}
    };

    std::cout << typeid(inner_type<decltype(v)>::type).name();
}

输出:

struct inner_type<class std::vector<int,class std::allocator<int> > >

共有3个答案

冯宪
2023-03-14

@tjmisa1992的解决方案是可以的,但是不允许具有不同分配器的向量。此外,让我们使这个C 14友好与一个_t版本的特性。

这应该可以做到:

template <typename T> struct inner_type { using type = T; };

template<class T, class Alloc>
struct inner_type<std::vector<T, Alloc>> { using type = typename inner_type<T>::type; };

template<class T>
using inner_type_t = typename inner_type<T>::type;

另外,对于类型名,您应该使用此处为C 14或C 17实现的type\u name()函数。

看它在现场工作...

史鸿运
2023-03-14

一个解决方案,遵循了子弹石的建议,使用value_type成员类型:

template<class T, typename = void>
struct inner_type {
    using type = T;
};

template<class T>
struct inner_type<T, std::void_t<typename T::value_type>>
    : inner_type<typename T::value_type> {};

template<class T>
using inner_type_t = typename inner_type<T>::type;

using VV = std::vector<std::vector<int>>;
static_assert(std::is_same_v<inner_type_t<VV>, int>);

关于std::void\t的工作原理,可以在这个问题中找到一个很好的解释。如果typename T::value\u type格式不正确,则在这里使用它以静默方式拒绝专门化。

梁烨
2023-03-14

哇,我真的很接近哈哈,成功了!

我只需要稍微改变模板特殊化,以正确地递归获取类型。

template <typename T>
struct inner_type
{
    using type = T;
};

template <typename T>
struct inner_type<std::vector<T>>
{
    // Had to change this line
    using type = typename inner_type<T>::type;
};

int main()
{
    std::vector<std::vector<int>> v  = {
        { 1, 2}, {3, 4}
    };

    std::cout << typeid(inner_type<decltype(v)>::type).name();
}

输出:

int
 类似资料:
  • 下面的代码显示了我要做的:

  • Oracle留档(在下面的链接)说: 非静态嵌套类(内部类)可以访问封闭类的其他成员,即使它们被声明为私有的。 但在下面的示例中,我创建了一个对象(内部类),它无法访问其封闭外部类的任何方法或变量。下面是代码,你能解释一下吗? http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html 使用Main方法初始化 对于对象,我无法访问其

  • 我好像不知道我错在哪了。请参阅https://ideone.com/wkszsn 我试图创建一个函数,该函数只有在其参数是某种模板化类时才存在,为迭代器公开一个typedef。 在非条件情况下,函数看起来如下所示: 在本例中,类型扣除对此代码段很有效: 好的。现在我想对参数进行类型推导,并使container类公开typedef迭代器。使用herb sutter gotw sfinae模式,我创建

  • 问题内容: Go支持在函数内部嵌套结构,但除了lambda之外没有嵌套函数,这是否意味着无法在函数内部定义嵌套类? 因此,类在函数内部被削弱感到有点奇怪。 有什么提示吗? 问题答案: 实际上,无论您要声明 带有 接收器还是 不 带有接收器的函数都没有关系:不允许在Go中嵌套函数。 尽管您可以使用函数文字来实现以下目的: 在这里,我们创建了一个具有函数类型的变量,并将其分配给另一个函数。调用“外部”

  • 问题内容: 我正在为新网站构建 用户类 ,但是这次我在考虑构建它有点不同… C ++ , Java 甚至 Ruby (可能还有其他编程语言)都允许在主类内部使用嵌套/内部类,这使我们可以使代码更加面向对象和组织化。 在PHP中,我想这样做: 这在PHP中可行吗?我该如何实现? 更新 如果不可能,将来的PHP版本是否会支持嵌套类? 问题答案: 介绍: 嵌套类与其他类的关系与外部类略有不同。以Java

  • 如果我们有 我们将插入 方法1:我们可以做: 方法二,我们不能这样做? 这个错误意味着什么? 错误C2664:“标准::_Vector_iterator,标准::equal_to 如果我们需要将作为全局来处理,解决方案是什么?