1

出于某种原因,当我尝试使用 中std::cerr的变量时std::tuple,我的程序崩溃了。我的猜测是std::get<int>( std::tuple )返回乱码。由于std::tuple标准中的一些奇怪的措辞,或者 a错误的实施)?例如,从副本中,当您尝试阅读一个(即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

传递给 an 的值有什么原因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 回答