Контекст: Я играю с написанием шаблонов выражений и функций C ++ 11. Прикрепленный пример кода — просто эксперимент для развлечения. В этом варианте ET каждое выражение отслеживает свой собственный тип возвращаемого значения. common_type
затем используется компилятором, чтобы найти, какие типы возвращаемых значений других выражений будут основаны на возвращаемых типах подвыражений.
Проблема: Вы можете увидеть полный пример Вот
У меня есть набор функций, которые динамически выясняют тип возвращаемого значения, используя common_type
вот так:
template
<
typename... Args2,
typename T1,
template < typename... > class T2
>
Binary
<
T1,
T2< Args2... >,
typename common_type< T1 , typename select_last< Args2... >::type >::type
> const
operator*(T1 u, T2< Args2... > v)
{
cout << "Operator (value, expr)" << endl;
return Binary
<
T1,
T2< Args2... >,
typename common_type< T1 , typename select_last< Args2... >::type >::type
>(u, v);
}
Когда скомпилировано с
clang++ -std=c++11 -O3 -Wall -pedantic -Wextra main.cpp -lboost_iostreams -lz
все отлично работает Когда скомпилировано с clang++ -stdlib=libc++ -std=c++11 -O3 -Wall -pedantic -Wextra main.cpp -lcxxrt -ldl -lboost_iostreams -lz
Я получаю ошибки сборки, когда не примитивы передаются в common_type
, (ака incompatible operand types ('Unary<int, int>' and 'int')
)
Вопрос: Соответствует ли неправильная функция? Это похоже на common_type
может оцениваться даже в неиспользуемых функциях. Есть ли простой способ отложить оценку common_type
для двух операторов терминальных выражений?
Задача ещё не решена.