我正在尝试编写一个模板,该模板将从函数的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,因为该函数本身是用于找出类型的,因此我可以在其他地方使用它。

最佳答案

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

正确的方法是通过递归模板...

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);

10-08 11:16