正如一个侧面说明:
新的C++标准引入了可变参数模板,并与同样元组。 gcc和Visual Studio(至少)支持这些。所以,如果它是可能的(即如果所有支持的编译器都支持已经很可能的元组),那么你可以使用它。
唯一的问题是,某些编译器在std :: tr1名称空间中仍然有元组,而其他编译器在std名称空间中已经有它。有时你需要包括,有时。但是您可以配置您的构建系统来定义一些可帮助您支持多种方案的宏。如果,例如只需要支持的Visual Studio 10和/或一个比较新的gcc版本,你可以做到以下几点:
#include <list>
#include <string>
#include <tuple>
std::list<std::tuple<int, string> > time;
例如通过CMake,你可以生成一个头文件,它带给你的所有支持编译器,它支持元组(并且稍微有更多的工作,甚至使用boost作为后退)。
要做到这一点,你会创造这样一个tuple.h.cmake文件:
#if defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ < 430)
# define GCC_OLDER_THAN_430 1
#endif
#if defined(_MSC_VER) && (_MSC_VER < 1600 /* 2010 */)
# define MSC_OLDER_THAN_2010 1
#endif
#if defined(GCC_OLDER_THAN_430)
# define TR1_IN_TR1_SUBDIRECTORY 1
#endif
#if defined(ZORBA_GCC_OLDER_THAN_430) || defined(ZORBA_MSC_OLDER_THAN_2010)
# define TR1_NS_IS_STD_TR1 1
#endif
#ifdef TR1_NS_IS_STD_TR1
# define TR1_NS std::tr1
#else
# define TR1_NS std
#endif
#ifdef TR1_IN_TR1_SUBDIRECTORY
# include <tr1/tuple>
#else
# include <tuple>
#endif
然后,例如看起来像上面如下:
#include <string>
#include <list>
#include "tuple.h"
std::list<TR1_NS::tuple<int, std::string> > time;
这应该工作在几乎所有的最近的编译器。
愚蠢的问题:你记得添加使用名称空间标准/使用名称空间提升?你得到的具体错误信息是什么? – Mikola
你有没有“使用命名空间提升;”在你的代码?我想你需要一个“使用命名空间标准;”以及。 –
我想,你可以使用std :: map来达到这个目的。它将保存对“int-string”,自动按“int”值排序。 [这里](http://www.cplusplus.com/reference/stl/map/)是说明。 –
beduin