出于某种原因,当我尝试使用 中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。这是编译器错误吗?