我正在尝试编写一个模板,该模板将从函数的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);