C++ 元编程 - 创建一个包含模板化方法的所有变体的元组
C++ Metaprogramming - Create a tuple containing all variants of a templated method
部分伪代码如下:
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
}
目标是每次都重新定义元组,但仍然保留旧的 "stored" 类型,这意味着只附加最后一个。
如果您有任何问题,请随时提出。我不太确定我是否解释得很好,但我不知道任何其他相关的事情可以告诉你。
感谢您的宝贵时间,
它并不像您想象的那样有效。元组是类型,而不是值。它们本质上是不可变的。他们实现您想要的方法是制造新类型作为涉及先前类型的元函数的结果:
#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;
}
部分伪代码如下:
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
}
目标是每次都重新定义元组,但仍然保留旧的 "stored" 类型,这意味着只附加最后一个。
如果您有任何问题,请随时提出。我不太确定我是否解释得很好,但我不知道任何其他相关的事情可以告诉你。
感谢您的宝贵时间,
它并不像您想象的那样有效。元组是类型,而不是值。它们本质上是不可变的。他们实现您想要的方法是制造新类型作为涉及先前类型的元函数的结果:
#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;
}