هل boost.tuple متوافق مع قوالب c ++ 0x variadic؟
-
01-10-2019 - |
سؤال
كنت ألعب مع قوالب variadic (GCC 4.5) وضربت هذه المشكلة:
template <typename... Args>
boost::tuple<Args...>
my_make_tuple(Args... args)
{
return boost::tuple<Args...>(args...);
}
int main (void)
{
boost::tuple<int, char> t = my_make_tuple(8, 'c');
}
رسالة خطأ في مجلس التعاون الخليجي:
sorry, unimplemented: cannot expand 'Arg ...' into a fixed-length argument list
In function 'int my_make_tuple(Arg ...)'
إذا استبدلت كل حدوث boost::tuple
بواسطة std::tuple
, ، يجمع بشكل جيد.
هل هناك مشكلة في تعزيز تنفيذ tuple؟ أم أن هذا خطأ في مجلس التعاون الخليجي؟
يجب أن ألتزم بـ Boost.tuple الآن. هل تعرف أي حلول؟
شكرًا.
المحلول
لا يبدو أنه يحب التوسع Args...
إلى T1, T2, T3, ..., T9
كما دفعة لديه.
كحل بديل ، استخدم بنيات لا تتطلب هذا التوسع:
#include <boost/tuple/tuple.hpp>
template <typename... Args>
auto my_make_tuple(Args... args) -> decltype(boost::make_tuple(args...))
{
return {args...};
}
int main (void)
{
boost::tuple<int, char> t = my_make_tuple(8, 'c');
}
قد يكون هناك خيار آخر هو القيام بالتوسع يدويًا ، ورؤية ذلك boost::tuple
يدعم ما يصل إلى 10 الحجج.
#include <boost/tuple/tuple.hpp>
template <unsigned, class, class...> struct nth_argument;
template <unsigned N, class Default, class T, class... Args>
struct nth_argument<N, Default, T, Args...>
{
typedef typename nth_argument<N - 1, Default, Args...>::type type;
};
template <class Default, class T, class... Args>
struct nth_argument<0, Default, T, Args...>
{
typedef T type;
};
template <unsigned N, class Default>
struct nth_argument<N, Default>
{
typedef Default type;
};
template <typename ...Args>
struct tuple_from_var_template
{
typedef boost::tuple<
typename nth_argument<0, boost::tuples::null_type, Args...>::type,
typename nth_argument<1, boost::tuples::null_type, Args...>::type,
typename nth_argument<2, boost::tuples::null_type, Args...>::type,
typename nth_argument<3, boost::tuples::null_type, Args...>::type,
typename nth_argument<4, boost::tuples::null_type, Args...>::type,
typename nth_argument<5, boost::tuples::null_type, Args...>::type,
typename nth_argument<6, boost::tuples::null_type, Args...>::type,
typename nth_argument<7, boost::tuples::null_type, Args...>::type,
typename nth_argument<8, boost::tuples::null_type, Args...>::type,
typename nth_argument<9, boost::tuples::null_type, Args...>::type
> type;
};
template <typename... Args>
typename tuple_from_var_template<Args...>::type my_make_tuple(Args... args)
{
return typename tuple_from_var_template<Args...>::type(args...);
}
int main (void)
{
boost::tuple<int, char> t = my_make_tuple(8, 'c');
}
لا تنتمي إلى StackOverflow