1

std::cerrで変数を使用しようとすると、何らかの理由std::tupleでプログラムがクラッシュします。私の推測では、それstd::get<int>( std::tuple )は garbledy-gook を返しているということです。に渡された値が変更される理由はありますかstd::tuple(渡したとき、または std::get< int >( std::tuple ) の呼び出し時に、標準の奇妙な言い回しのために、または不完全な実装)?たとえば、コピーから、コピーを読み取ろうとすると何かばかげたこと (すなわちstd::get) が発生しますか?

編集: この質問は抽象的なものであり、必ずしも以下のコードに関するものではありませんが、std::tuple に関する情報を提供するために、私 (およびこの投稿を読んだ他の人) は将来使用できる可能性があります。

更新: MinGW GCC 4.4.1 からも動作します。

更新:
私のコードが ideone.com で実行されていることに気付きました:

#include <iostream>
#include <string>
#include <vector>
#include <tuple>
#include <typeinfo>
#include <stdio.h>
#include <string.h>

template< int IETORATOR_T, typename TUPLE, typename FUNCTION_POINTER_T, typename... ARGUMENTS_T >
struct FunctionRunner
{
    FunctionRunner( TUPLE* tuple, FUNCTION_POINTER_T functionToRun, ARGUMENTS_T... arguments )
    {
        std::cerr << "Hi there!\n";
        //TEST CODE.//
        ///////////////////////////////////////////
        /////I can read from the value.//
        auto j = std::forward< decltype( std::get< IETORATOR_T >( *tuple ) ) >( std::get< IETORATOR_T >( *tuple ) );
        //I can write to the value.//
        j += 2;
        std::cerr << "------------\n";
        //I cant cerr the value? 0.0//
        std::cerr << "Passing " << j << "\n";
        FunctionRunner< IETORATOR_T - 1, TUPLE, FUNCTION_POINTER_T, decltype( std::get< IETORATOR_T >( *tuple ) ), ARGUMENTS_T... > runner{ 
                tuple, functionToRun, std::get< IETORATOR_T >( *tuple ), arguments... };
    }
};
template< typename TUPLE, typename FUNCTION_POINTER_T, typename... ARGUMENTS_T >
struct FunctionRunner< ( -1 ), TUPLE, FUNCTION_POINTER_T, ARGUMENTS_T... >
{
    FunctionRunner( TUPLE* tuple, FUNCTION_POINTER_T functionToRun, ARGUMENTS_T... arguments ) {
        functionToRun( arguments... );
    }
};

template< typename... ARGUMENT_TYPES_T >
struct ArgumentMaker
{
    std::tuple< ARGUMENT_TYPES_T... >* argumentData;
    ArgumentMaker( ARGUMENT_TYPES_T... arguments ) {
        argumentData = new std::tuple< ARGUMENT_TYPES_T... >( std::forward< ARGUMENT_TYPES_T >( arguments )... );
    }
    ~ArgumentMaker() {
        delete argumentData;
    }
    template< typename FUNCTION_POINTER_T >
    void ExecuteFunction( FUNCTION_POINTER_T functionToRun ) {
        FunctionRunner< ( std::tuple_size< std::tuple< ARGUMENT_TYPES_T... > >::value - 1 ), 
                std::tuple< ARGUMENT_TYPES_T... >, FUNCTION_POINTER_T > runner{ argumentData, functionToRun };
    }
};

void Test( int a, double d, float c ) {
    std::cerr << a << " " << d << " " << c << "\n";
}

int main()
{
    int a = 2;
    double b = 34.5;
    float c = 45.6f;
    auto* maker = new ArgumentMaker< int, double, float >( a, b, c );
    maker->ExecuteFunction( &Test );
    delete maker;
    return ( 0 );
}

デスクトップで使用しているコンパイラは、MinGW の GCC 4.8.1-4 です。これはコンパイラのバグですか?

4

1 に答える 1

1

に渡される値が変更される理由はありますstd::tupleか?

いいえ、変更しない限り、もちろん違います。Astd::tupleはメンバーとして値を保持する単なる構造であり、値をサイレントに更新する魔法のようなプロパティはありません。

関係のない雑然としたものではなく、本当に基本的なものにコードを単純化して、それが機能するかどうかを確認する必要があります。

#include <tuple>
#include <iostream>

int main()
{
    std::tuple<int> t{ 1 };
    std::cerr << std::get<0>(t);
}

それでもうまくいかない場合は、さらに簡単にします。

#include <iostream>

int main()
{
    int t = 1 ;
    std::cerr << t;
}

それでもうまくいかない場合は、MinGW のインストールで何かが大きく壊れていますtupleが、元のコードの可変個引数テンプレートや動的割り当てなどとは何の関係もありません。

于 2013-11-03T23:31:57.883 に答える