Информация:
В настоящее время я пытаюсь изучить шаблонное метапрограммирование (следуя этой книге). Один полезный пример, который они приводят, касается размерного анализа. Я реализовал это как в книге, и все было хорошо; см. здесь.
Моя проблема, однако, заключается в том, что я хочу использовать структуру многомерного анализа со смешанными типами. Под этим я подразумеваю, что вы могли бы сказать, что скаляр с измерениями массы умножает вектор на измерения ускорения, чтобы получить векторную силу. По ссылке они работают только с одним и тем же типом 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
? Или; возможно ли это сделать таким образом, и если нет, то как можно вычислить возвращаемый тип функции?
Спасибо.