前几天我问了一个关于嵌套向量的非常类似的问题,但我遇到了另一个让我难堪的问题。我需要在编译时获取嵌套向量的最内层类型,以便将其作为模板参数传递。
例如,如果我有这个嵌套向量:
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> > >
@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()
函数。
看它在现场工作...
一个解决方案,遵循了子弹石的建议,使用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
格式不正确,则在这里使用它以静默方式拒绝专门化。
哇,我真的很接近哈哈,成功了!
我只需要稍微改变模板特殊化,以正确地递归获取类型。
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 如果我们需要将作为全局来处理,解决方案是什么?