gpt4 book ai didi

C++ 可变参数模板数组/访问元素

转载 作者:行者123 更新时间:2023-11-30 04:09:47 26 4
gpt4 key购买 nike

在 C++ 中,我如何能够像数组一样访问可变参数模板的元素?我已经做了一个基本的尝试来展示我想要在下面实现的目标,但是,当然,它不会编译:

template<class... Args> struct Apple{
public:
Apple(Args... A) : V(A){}
Apple() : p(0){}
void push_back(decltype(V[p]) v){
V[p++] = v;
}
private:
Args... V;
int p;
};

int main(){
Apple<int, double> a(5, 6.5);
Apple<int, double> b;
b.push_back(5);
b.push_back(6.5);
}

最佳答案

我建议您看一下可变参数模板。 typename... Ts 不是数组。所以你不能指望 Args...v 被扩展为一个数组。此外,您将如何使用不同类型的每个元素创建一个数组?

您的要求与 std::tuple 提供的非常相似,您应该看看它的实现。

看看this GoingNative 2012 video安德烈给的。这是对可变参数模板的精彩介绍。


这是我玩可变参数模板时的玩具 tuple 之一。与 C++11 STL 提供的内容有些重复,但无论如何都是玩具。

#include <iostream>
#include <vector>
#include <typeinfo>
#include <type_traits>

using namespace std;

template <typename T, typename... Ts> class MyTuple : public MyTuple<Ts...> {
using base = MyTuple<Ts...>;

public:
T elem;

MyTuple(T v, Ts... vs) : base(vs...), elem(v) {}
};

template <typename T> class MyTuple<T> {
public:
T elem;

MyTuple(T v) : elem(v) {}
};

template <int i, typename T, typename... Ts> struct type_of {
static_assert(i < sizeof...(Ts) + 1, "index out of range");
typedef typename type_of<i - 1, Ts...>::type type;
};

template <typename T, typename... Ts> struct type_of<0, T, Ts...> {
typedef T type;
};

template <int i, typename T, typename... Ts>
typename enable_if<i == 0, typename type_of<i, T, Ts...>::type&>::type get(MyTuple<T, Ts...> &t) {
static_assert(i >= 0, "index out of range");
static_assert(i < sizeof...(Ts) + 1, "index out of range");

return t.elem;
}

template <int i, typename T, typename... Ts>
typename enable_if<i != 0, typename type_of<i, T, Ts...>::type&>::type get(MyTuple<T, Ts...> &t) {
static_assert(i >= 0, "index out of range");
static_assert(i < sizeof...(Ts) + 1, "index out of range");

MyTuple<Ts...>& base = t;
return get<i - 1>(base);
}

int main(int argc, char const *argv[]) {
cout << typeid(type_of<0, int, char, long>::type).name() << endl; // print i
cout << typeid(type_of<1, int, char, long>::type).name() << endl; // print c
cout << typeid(type_of<2, int, char, long>::type).name() << endl; // print l

MyTuple<int, int> t(0, 1);

cout << get<0>(t) << endl;
cout << get<1>(t) << endl;

return 0;
}

关于C++ 可变参数模板数组/访问元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20948815/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com