- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想访问元组成员并不断累积结果。但不起作用,它看起来像访问越界(不完整类型的无效使用 struct std::tuple_element<0u, std::tuple<> >
)
#include <iostream>
#include <tuple>
template<typename...ARGS>
struct NextTest
{
std::tuple<ARGS...> data;
template<std::size_t I,bool=I<sizeof...(ARGS)>
struct Dispatch{};
template<std::size_t I,typename T>
T next3(T t,Dispatch<I,false>)const
{
return t;
}
template<std::size_t I,typename T>
auto next3(T t,Dispatch<I,true>)const->decltype(this->next3<I+1>(std::get<I>(data),Dispatch<I+1>{}))
{
return this->next3<I+1>(std::get<I>(data),Dispatch<I+1>{});
}
template<std::size_t I,typename T>
auto next3(T t)const->decltype(this->next3<I>(t,Dispatch<I>{}))
{
return this->next3<I>(t,Dispatch<I>{});
}
template<std::size_t I,typename T,typename std::enable_if<(I>=sizeof...(ARGS))>::type* =nullptr>
T next(T t)const
{
return t;
}
template<std::size_t I,typename T,typename std::enable_if<(I<sizeof...(ARGS))>::type* =nullptr>
auto next(T t)const->decltype(this->next<I+1>(std::get<I>(data)))
{
return this->next<I+1>(std::get<I>(data));
}
template<std::size_t I,typename std::enable_if<(I>=sizeof...(ARGS))>::type* =nullptr>
void next2()const
{
std::cout<<"end!";
}
template<std::size_t I,typename std::enable_if<(I<sizeof...(ARGS))>::type* =nullptr>
void next2()const
{
std::cout<<"in seq ";
next2<I+1>();
}
};
void testexpr1()
{
NextTest<int> nt;
nt.next<0>( 1);//fail
nt.next3<0>( 1);//fail
nt.next2<0>();//pass!
}
mingw gcc 4.8.1 为什么报错?我该怎么办?
**update1:**这符合:
...\include\c++\tuple||In instantiation of 'struct std::tuple_element<1u, std::tuple<int> >':|
...\include\c++\tuple|771| required by substitution of 'template<unsigned int __i, class ... _Elements> constexpr typename std::__add_r_ref<typename std::tuple_element<__i, std::tuple<_Elements ...> >::type>::type std::get(std::tuple<_Elements ...>&&) [with unsigned int __i = 1u; _Elements = {int}]'|
...\test.cpp|83| required by substitution of 'template<unsigned int I, class T> decltype (this->.next1<(I + 1)>(get<I>(this->.data))) NextTest<ARGS>::next1(T&, typename std::enable_if<(I < sizeof (ARGS ...))>::type*) [with unsigned int I = I; T = T; ARGS = {int}] [with unsigned int I = 1u; T = <missing>]'|
...\test.cpp|83| required by substitution of 'template<unsigned int I, class T> decltype (this->.next1<(I + 1)>(get<I>(this->.data))) NextTest<ARGS>::next1(T&, typename std::enable_if<(I < sizeof (ARGS ...))>::type*) [with unsigned int I = I; T = T; ARGS = {int}] [with unsigned int I = 0u; T = int]'|
...\test.cpp|104|required from here|
...\include\c++\tuple|680|error: invalid use of incomplete type 'struct std::tuple_element<0u, std::tuple<> >'|
...\include\c++\utility|84|error: declaration of 'struct std::tuple_element<0u, std::tuple<> >'|
最佳答案
代码中似乎有两个错误:
解决这两个问题后,代码可以在 gcc 4.7.2 上正常编译。
固定代码如下:
#include <iostream>
#include <tuple>
template<typename...ARGS>
struct NextTest
{
std::tuple<ARGS...> data;
template<std::size_t I,bool=(I+1)<sizeof...(ARGS)>
struct Dispatch{};
template<std::size_t I,typename T>
T next3(T t,Dispatch<I,false>)const
{
return t;
}
template<std::size_t I,typename T>
auto next3(T t,Dispatch<I,true>)const->decltype(this->next3<I+1>(std::get<I>(this->data),Dispatch<I+1>{}))
{
return this->next3<I+1>(std::get<I>(data),Dispatch<I+1>{});
}
template<std::size_t I,typename T>
auto next3(T t)const->decltype(this->next3<I>(t,Dispatch<I>{}))
{
return this->next3<I>(t,Dispatch<I>{});
}
template<std::size_t I,typename T,typename std::enable_if<((I+1)>=sizeof... (ARGS))>::type* =nullptr>
T next(T t)const
{
return t;
}
template<std::size_t I,typename T,typename std::enable_if<((I+1)<sizeof...(ARGS))>::type* =nullptr>
auto next(T t)const->decltype(this->next<I+1>(std::get<I>(this->data)))
{
return this->next<I+1>(std::get<I>(data));
}
template<std::size_t I,typename std::enable_if<((I+1)>=sizeof...(ARGS))>::type* =nullptr>
void next2()const
{
std::cout<<"end!";
}
template<std::size_t I,typename std::enable_if<((I+1)<sizeof...(ARGS))>::type* =nullptr>
void next2()const
{
std::cout<<"in seq ";
next2<I+1>();
}
};
void testexpr1()
{
NextTest<int> nt;
nt.next<0>( 1);//pass
nt.next3<0>( 1);//pass
nt.next2<0>();//pass!
}
关于c++ - 为什么重载成员函数访问元组和递归累积结果失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25301302/
所以,我只是按照 Think Python 教程继续了元组部分,我想问的是为什么它有效: def sumall(*args): return sum(args) print sumall(1,
使用新的 C# 7 元组语法,是否可以指定一个以元组作为参数的 lambda 并在 lambda 中使用未打包的值? 例子: var list = new List(); 在 lambda 中使用元组
使用新的 C# 7 元组语法,是否可以指定一个以元组作为参数的 lambda 并在 lambda 中使用未打包的值? 例子: var list = new List(); 在 lambda 中使用元组
这已经给我带来了一些麻烦,也许我的视力受到了影响。给定一个整数列表,生成一个新列表,其中每组相邻的重复项都已变成一个元组。 例如,给定列表:[1, 2, 3, 3, 4, 5, 5, 5, 6] 生成
我使用 python 生成一些 POVray 渲染代码,以可视化某些计算数据。我需要将很多参数从 python 传递到 POVray 代码字符串。我想让纸条更干净。所以我想直接使用元组和数组作为字符串
scala> val two = (1,2) two: (Int, Int) = (1,2) scala> val one = (1,) :1: error: illegal start of sim
我在理解 rpy2 对象和 python 对象的映射时遇到了一些问题。 我有一个在 python 中返回一个元组对象的函数 (x),我想用 R 对象列表或向量映射这个元组对象。 首先,我正在尝试这样做
假设我有一个元组: let t = (1,'a') 我想创建一个三元组/三元组: let createTriple (a,b) c = (a, b, c) F# 中是否有一种语法可以让我从 n
//An N-tuple (quadruple?) that is a subset of a row type Quadruple = [string, string, number, boolea
我是一名优秀的程序员,十分优秀!