Kinexity Temat założony przez niniejszego użytkownika |
[VC++] Szablon funkcji operator+ dla std::tuple » 2019-12-21 15:21:46 Próbuję zrobić to co jest napisane w tytule. Kod: template < std::size_t element_index, typename...Types > std::tuple < Types...>&& tuple_sum( std::tuple < Types...>& tuple1, std::tuple < Types...>& tuple2 ) { std::tuple < Types...> _tuple_ = tuple_sum < element_index + 1, Types...>( tuple1, tuple2 ); std::get < element_index >( _tuple_ ) = std::get < element_index >( tuple1 ) + std::get < element_index >( tuple2 ); return _tuple_; }
template < typename...Types > std::tuple < Types...>&& tuple_sum <( sizeof...( Types ) ), Types...>( std::tuple < Types...>& tuple1, std::tuple < Types...>& tuple2 ) { return std::tuple < Types...>(); }
template < typename...Types > std::tuple < Types...>&& operator +( std::tuple < Types...>& tuple1, std::tuple < Types...>& tuple2 ) { return tuple_sum < 0, Types...>( tuple1, tuple2 ); }
Problem leży w tym, że w specjalizacji szablonu funkcji tuple_sum VS wywala błąd: error C2768: "tuple_sum": niedozwolone użycie argumentów jawnego szablonu Co robię nie tak? |
|
DejaVu |
» 2019-12-21 22:54:38 Napisz: std::tuple < Types...> tuple_sum( const std::tuple < Types...>& tuple1, const std::tuple < Types...>& tuple2 )
Zamiast: std::tuple < Types...> tuple_sum < Types...>( const std::tuple < Types...>& tuple1, const std::tuple < Types...>& tuple2 )
/edit: Niemniej jednak rozwiązanie wygląda tak: #include <tuple> #include <iostream>
template < std::size_t I = 0, typename...Tp > inline typename std::enable_if < I == sizeof...( Tp ), void >::type sumTuples( const std::tuple < Tp...>& t1, const std::tuple < Tp...>& t2, std::tuple < Tp...>& _result ) { }
template < std::size_t I = 0, typename...Tp > inline typename std::enable_if < I < sizeof...( Tp ), void >::type sumTuples( const std::tuple < Tp...>& t1, const std::tuple < Tp...>& t2, std::tuple < Tp...>& _result ) { std::get < I >( _result ) = std::get < I >( t1 ) + std::get < I >( t2 ); sumTuples < I + 1, Tp...>( t1, t2, _result ); }
template < typename...Types > std::tuple < Types...> operator +( const std::tuple < Types...>& tuple1, const std::tuple < Types...>& tuple2 ) { std::tuple < Types...> result; sumTuples( tuple1, tuple2, result ); return result; }
int main( int argc, char ** argv ) { std::tuple < int, double, int > x( 1, 2.3, 3 ); auto y = x + x; std::cout << "Result: " << std::get < 0 >( y ) << ", " << std::get < 1 >( y ) << ", " << std::get < 2 >( y ) << std::endl; return 0; }
Wynik: Result: 2, 4.6, 6
|
|
pekfos |
» 2019-12-22 14:51:18 Dodam od siebie, że od C++17 można funkcje sumTuples powyżej można zapisać tak: template < std::size_t I = 0, typename...Tp > inline void sumTuples( const std::tuple < Tp...>& t1, const std::tuple < Tp...>& t2, std::tuple < Tp...>& _result ) { if constexpr( I < sizeof...( Tp ) ) { std::get < I >( _result ) = std::get < I >( t1 ) + std::get < I >( t2 ); sumTuples < I + 1, Tp...>( t1, t2, _result ); } } |
|
Kinexity Temat założony przez niniejszego użytkownika |
» 2019-12-24 12:57:24 Dzięki za pomoc. Zamykam temat. |
|
« 1 » |