Можно ли написать функцию, которая принимает тип и возвращает другой тип - PullRequest
5 голосов
/ 05 июля 2011

Можно ли написать функцию, которая принимает тип и возвращает (связанный) тип.Например, функция, которая принимает тип с именем «RandomVariable» и возвращает тип с именем «RandomVariableCovariance».Я предполагаю, что в целом вопрос заключается в том, могут ли typenames быть параметрами или типами возвращаемых данных.C ++ 0x в порядке.

Ответы [ 4 ]

11 голосов
/ 05 июля 2011

Вы не можете сделать это с помощью функций, но вы можете сделать это с помощью специализаций шаблонов.Например,

template <class T>
struct ConvertType;

template <>
struct ConvertType<RandomVariable>
{
    typedef RandomVariableCovariance type;
};

int main()
{
    ConvertType<RandomVariable>::type myVar;
}

Определяет тип ConvertType, который специализируется для преобразования из RandomVariable в RandomVariableCovariance.Таким образом, можно делать все виды умного выбора типа в зависимости от того, что вам нужно.

2 голосов
/ 05 июля 2011

Typenames не может быть параметрами или возвращаемыми значениями функции; типы - это время компиляции!

0 голосов
/ 05 июля 2011

Это было в длинном списке вещей для C ++ 0x. Вот почему они создали этот формат определения нечетной функции:

auto FuncName(Type1 param1, Type2 param2) -> ReturnType {...}

Это, в сочетании с decltype, позволяет делать такие вещи:

auto FuncName(Type1 param1, Type2 param2) -> decltype(param1 + param2) {...}

Это означает, что тип возвращаемого значения будет тем, что вы получите при вызове оператора + (Тип1, Тип2).

Обратите внимание, что C ++ является статически типизированным языком. Вы не можете делать вычисления типа во время выполнения. Это должно быть сделано во время компиляции с помощью механизмов, подобных этому, или какой-либо формы метапрограммирования шаблонов.

0 голосов
/ 05 июля 2011

Прошу прощения за мой ужасный C, так как это было навсегда, так как я на самом деле работал с ним:

typedef int RandomVariable;
typedef float RandomVariableCovariance;

RandomVariableCovariance myFunc(RandomVariable x) {
    ....
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...