gpt4 book ai didi

C++ 元编程 - 创建一个包含模板化方法的所有变体的元组

转载 作者:行者123 更新时间:2023-11-28 06:02:55 24 4
gpt4 key购买 nike

部分伪代码如下:

struct Meta
{
std::tuple<..., ..., ...> funcVariantsTuple;

template<typename T>
void addVariantToTuple()
{
/* Do stuff */
}
}

class A
{
public:
template<typename T>
void func()
{
Meta::addVariantToTuple<T>();
}
};

int main()
{
A a;
a.func<int>();
constexpr first = std::tuple_size<decltype(Meta::funcVariantsTuple)>();
std::cout << first << std::endl; // Prints 1
a.func<char>();
constexpr second = std::tuple_size<decltype(Meta::funcVariantsTuple)>();
std::cout << second << std::endl; // Prints 2
}

目标是每次都重新定义元组,但仍然保留旧的“存储”类型,这意味着只附加最后一个。

如果您有任何问题,请随时提出。我不太确定我是否解释得很好,但我不知道有任何其他相关的事情可以告诉你。

谢谢你的时间,

最佳答案

它并不像您想象的那样有效。元组是类型,而不是值。它们本质上是不可变的。他们实现您想要的方法是制造新类型作为涉及先前类型的元函数的结果:

#include <iostream>
#include <tuple>

template<class Tuple = std::tuple<>>
class A
{
public:
using tuple = Tuple;

template<typename T>
struct func
{
using type = A<decltype(std::tuple_cat(std::declval<tuple>(), std::declval<std::tuple<T>>()))>;
};

};
using namespace std;

auto main() -> int
{
using a = A<>;
using b = a::func<int>::type;
using c = b::func<char>::type;

constexpr auto first = tuple_size<b::tuple>();
cout << first << endl;

constexpr auto second = tuple_size<c::tuple>();
cout << second << endl;

return 0;
}

关于C++ 元编程 - 创建一个包含模板化方法的所有变体的元组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32927859/

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