2015-11-01 3 views
2

Я пытаюсь написать шаблон, который вернет AliasSeq типов возврата из функций AliasSeq. Однако в моем коде, когда я пытаюсь скомпилировать его, он говорит мне Error: type (...) has no valueВозвращение динамического AliasSeq из шаблона

Это мой код, который я до сих пор:

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, потому что сама функция предназначена для определения типа, поэтому я могу использовать его в другом месте.

ответ

4

Как только вы определили alias, вы не можете изменить его. Вы также не можете вернуть AliasSeq s из функций, поскольку они не являются первоклассными значениями.

правильный способ сделать это было бы с помощью рекурсивного шаблона ...

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

о хорошо, если его не представляется возможным, используя эту пустоту с Еогеаспом Я думаю, мне нужно также переписать все мои другие функции, то – WebFreak001

3

Это звучит как хорошее применение для 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) 
Смежные вопросы