Это трюк, чтобы ограничить шаблоны функций - ограничить класс типов. Есть много понятий, как вектор экспрессия, скалярное выражение, выражение матрицы и т.д. Если вы хотите, чтобы написать шаблон функции, которая умножает вектор с скаляром вы могли бы попытаться написать
template<typename V, typename S>
some_type operator*(V v, S s); // vector * scalar
template<typename V, typename S>
some_type operator*(S s, V v); // scalar * vector
, но это не будет работать потому что обе декларации по существу эквивалентны, и никто не сказал, что V предполагается векторным выражением, а S предполагается скалярным выражением. Итак, что разработчики uBlas сделали это использовать CRTP, чтобы ограничить эти шаблоны:
template<typename V, typename S>
some_Type operator*(vector_expression<V> ve, scalar_expression<S> se);
Чтобы сделать эту работу все скалярные выражения S должны извлечь из scalar_expression<S>
и все векторные выражения V должны извлечь из vector_expression<V>
. Таким образом, этот оператор рассматривается только в том случае, если первый операнд действительно является выражением для вектора, а второй аргумент действительно является выражением для скаляра. Вы можете перегрузить этот шаблон функции вторым, который меняет оба параметра, и все в порядке.
Теперь, чтобы иметь возможность получить доступ к чему-либо из V и S (производным типам), нам нужно сделать отливку из базового класса в производный класс. Это и есть оператор преобразования в базовом классе.Поскольку базовый класс знает производный класс (это параметр шаблона), это не проблема. Имеет смысл выбрать самый слабый оператор-оператор, который позволяет этому актеру избегать ошибок. Это static_cast
. Его можно использовать для преобразования базы * в производную * без каких-либо значительных накладных расходов.
Я не понимаю, что вы пытаетесь сделать с вашим кодом
template<class E>
class vector_expression2 : private vector_expression<E>;
Если вы хотите, чтобы написать свой собственный вектор экспрессии, в качестве шаблона вы могли бы сделать это следующим образом:
template<class E>
class my_parameterized_vector_expression
: public vector_expression<my_parameterized_vector_expression<E> >;
Я не думаю, что это работает с частным наследством. По крайней мере, все шаблоны функций, которые принимают векторное выражение в качестве аргумента, не смогут получить доступ к оператору преобразования из базового класса, если вы используете частное наследование здесь.
извините, я испортил оригинальное сообщение и сделал разъяснения – Anycorn