【问题标题】:Introspecting Template Parameters (Especially Template Alias Parameters)内省模板参数(尤其是模板别名参数)
【发布时间】:2011-12-22 12:13:54
【问题描述】:

假设我有一个 D 模板结构:

struct Foo(alias pred) {}

我想写一个模板来反省一下 pred 是什么:

alias Foo!"a < b" FooLess;
static assert(introspectPred!(FooLess) == "a < b");

有什么简单的方法可以做到这一点吗?如果有,introspectPred如何实现?

【问题讨论】:

    标签: templates metaprogramming introspection d


    【解决方案1】:

    我唯一能想到的就是在Foo 类型中定义一个枚举并做一些基本的自省。例如:

    struct Foo(alias pred) 
    {
        enum string _pred = pred;
    }
    
    alias Foo!"a < b" FooLess;
    static assert(introspectPred!(FooLess) == "a < b");
    
    template introspectPred(T)
    {
        enum string introspectPred = getMember!(T, "_pred");
    }
    
    template getMember(T, string member)
    {
        static if (__traits(hasMember, T, member))
        {
            enum getMember = mixin("T." ~ member);
        }
        else
            enum getMember = "";    
    }
    
    void main()
    {
    
    }
    

    【讨论】:

      【解决方案2】:

      类似于 Andrej 的解决方案,但更灵活一点:

      struct Foo(alias pred)
      {
          enum Predicate = pred;
      }
      
      alias Foo!"a < b" FooLess;
      static assert(FooLess.Predicate == "a < b");
      
      // Other types of predicate work as well
      bool bar() { return true; }
      alias Foo!bar FooBar;
      static assert(FooBar.Predicate == bar);
      

      我只是完全抛弃了自省模板——你应该能够通过使用 typeof 和谓词成员上的 lot 来获得你需要的东西。

      【讨论】:

        【解决方案3】:
        template introspectPred(X:Foo!T,string T){alias T introspectPred;}
        template introspectPred(X:Foo!T,alias T){alias T introspectPred;}
        

        只有第二个重载就足够了,但 DMD 不同意。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-01-29
          • 1970-01-01
          • 2017-01-20
          • 1970-01-01
          • 2016-11-18
          • 2017-09-22
          相关资源
          最近更新 更多