【问题标题】:C++ Metaprogramming - Create a tuple containing all variants of a templated methodC++ 元编程 - 创建一个包含模板化方法的所有变体的元组
【发布时间】:2015-10-03 21:53:47
【问题描述】:

部分伪代码如下:

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                                              
}

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

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

感谢您的宝贵时间,

【问题讨论】:

  • C++ 是静态类型的。 decltype(Meta::funcVariantsTuple) 在程序的不同点不能神奇地不同。我坚信你的追求是没有希望的。
  • 我在问我们是否可以在编译期间重新定义一个类型,据说元编程是一种功能齐全的语言,目前这样的事情是可行的,但是如何,我有没有线索。
  • it is said that metaprogramming is a fully functional language 没错。在功能齐全的语言中,没有可变变量。但是您希望Meta::funcVariantsTuple 是这样一个变量。
  • 罗杰,我想我必须找到另一种方法来完成我的计划,谢谢伊戈尔的帮助。

标签: c++ metaprogramming template-meta-programming


【解决方案1】:

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

#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++ 不会让我做我想做的事。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多