Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[VC++] Szablon funkcji operator+ dla std::tuple

Ostatnio zmodyfikowano 2019-12-24 12:57
Autor Wiadomość
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:

C/C++
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 ) { //w tej linii jest problem
    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?
P-175840
DejaVu
» 2019-12-21 22:54:38
Napisz:
C/C++
std::tuple < Types...> tuple_sum( const std::tuple < Types...>& tuple1, const std::tuple < Types...>& tuple2 )
Zamiast:
C/C++
std::tuple < Types...> tuple_sum < Types...>( const std::tuple < Types...>& tuple1, const std::tuple < Types...>& tuple2 )

/edit:
Niemniej jednak rozwiązanie wygląda tak:
C/C++
#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 );
    //std::cout << std::get<I>(t1) << std::endl;
    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
P-175842
pekfos
» 2019-12-22 14:51:18
Dodam od siebie, że od C++17 można funkcje sumTuples powyżej można zapisać tak:
C/C++
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 );
    }
}
P-175850
Kinexity
Temat założony przez niniejszego użytkownika
» 2019-12-24 12:57:24
Dzięki za pomoc. Zamykam temat.
P-175861
« 1 »
  Strona 1 z 1