Так же, как примечание:
Новый стандарт 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;
Это должно работать почти на всех последних компиляторах.