Тип возврата функции шаблона

Информация:

В настоящее время я пытаюсь изучить шаблонное метапрограммирование (следуя этой книге). Один полезный пример, который они приводят, касается размерного анализа. Я реализовал это как в книге, и все было хорошо; см. здесь.

Моя проблема, однако, заключается в том, что я хочу использовать структуру многомерного анализа со смешанными типами. Под этим я подразумеваю, что вы могли бы сказать, что скаляр с измерениями массы умножает вектор на измерения ускорения, чтобы получить векторную силу. По ссылке они работают только с одним и тем же типом Tдля ввода и вывода всех операций.

У меня есть 3-векторный класс, в котором есть все необходимые операции для умножения/деления на скаляры и т.д.поэтому я хотел бы сделать что-то вроде

quantity m(1.0);
quantity a(vect(0.0,0.0,-9.81));
quantity f = m*a;

Первая попытка:

Чтобы добиться этого, я попытался расширить примеры из книги, чтобы обрабатывать два разных типа в качестве входных данных для operator*и operator// однако я врезался в стену, когда дело доходит до возвращаемого типа.

Я знаю, что возвращаемый тип double * vect— это vect, но если они наоборот vect * double, это все еще ] вектор. Хуже; в принципе тип возвращаемого значения может быть любым. Поэтому мне нужен способ расширить operator*до чего-то вроде

template
quantity >::type>
operator*(const quantity& q1, const quantity& q2)
{
    return quantity >::type>
                   (q1.value()*q2.value());
}

, где X— тип возвращаемого значения q1.value()*q2.value()и выводится во время компиляции. Я попытался просто добавить еще один шаблонный класс T3в подпись и заставить его вернуть T3, но, похоже, он не может определить, каким должен быть T3.

Вторая попытка:

Затем я попытался использовать decltypeследующим образом

template
struct return_type
{
    auto mult_f(const T1& a, const T2& b)->decltype(a*b){return a*b;}
    typedef decltype(mult_f) type;
};

template
quantity::type, typename boost::mpl::transform >::type>
operator*(const quantity& q1, const quantity& q2)
{
    return quantity::type,
                    typename boost::mpl::transform >::type>
                   (q1.value()*q2.value());
}

Однако это выдает множество непонятных ошибок компилятора.

Вопрос:

Тогда мой вопрос заключается в том, правильно ли я использую decltype, но не хватает некоторого синтаксиса, например. где-то есть спецификатор typename? Или; возможно ли это сделать таким образом, и если нет, то как можно вычислить возвращаемый тип функции?

Спасибо.

6
задан Dan 19 June 2012 в 09:07
поделиться