【问题标题】:Return dynamic AliasSeq from template从模板返回动态 AliasSeq
【发布时间】:2015-11-02 05:23:47
【问题描述】:

我正在尝试编写一个模板,该模板将从 AliasSeq 的函数返回 AliasSeq 的返回类型。但是在我的代码中,当我尝试编译它时,它告诉我Error: type (...) has no value

这是我到目前为止的代码:

template ReturnTypesFromFunctions(Functions...)
{
    auto ReturnTypesFromFunctions()
    {
        alias functions = AliasSeq!();
        foreach(fn; Functions)
        {
            functions = AliasSeq!(functions, ReturnType!fn);
        }
        return functions;
    }
}

基本上我想要做的是从这个自动生成一个AliasSeq 数组:

int a();
bool b();
double c();

alias functions = AliasSeq!(a, b, c);
alias returnTypes = ReturnTypesFromFunctions!functions;
// returnTypes -> AliasSeq [int, bool, double]

但是使用当前代码会导致这些错误:

Error: type (int) has no value
Error: type (bool) has no value
Error: type (double) has no value
Error: type () has no value

这可能与auto 有关,因为编译器无法从函数别名中找到类型。但是没有可以代表 AliasSeq 的类型,因为该函数本身用于查找类型,因此我可以在其他地方使用它。

【问题讨论】:

    标签: templates d


    【解决方案1】:

    一旦定义了alias,就无法修改它。您也不能从函数返回 AliasSeqs,因为它们不是一等值。

    执行此操作的正确方法是通过递归模板...

    template ReturnTypesFromFunctions(Funcs...) {
        static if(Funcs.length == 0)
            alias ReturnTypesFromFunctions = AliasSeq!();
        else
            alias ReturnTypesFromFunctions = AliasSeq!(ReturnType!(Funcs[0]), ReturnTypesFromFunctions!(Funcs[1..$]));
    }
    

    ...但是,在这种情况下,您只是在重新发明 staticMap 模板,所以请改用它。

    alias returnTypes = staticMap!(ReturnType, functions);
    

    【讨论】:

    • 哦,如果不可能将那个 void 与 foreach 一起使用,我想我还需要重写所有其他函数
    【解决方案2】:

    这听起来对staticMap 很有用

    import std.meta, std.traits;
    
    template ReturnTypesFromFunctions(Functions...) {
      alias ReturnTypesFromFunctions = staticMap!(ReturnType, Functions);
    }
    
    int a();
    bool b();
    double c();
    
    alias functions = AliasSeq!(a,b,c);
    alias returnTypes = ReturnTypesFromFunctions!functions;
    
    pragma(msg, returnTypes); // (int, bool, double)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-12
      • 2015-05-12
      • 2018-02-21
      • 1970-01-01
      • 2014-05-28
      • 2016-04-19
      • 2014-11-27
      • 2013-02-18
      相关资源
      最近更新 更多