В C++0x наконец-то доступно template typedef
!
Отказ от ответственности: ничего не скомпилировано...
Из статьи Википедии:
template< typename second>
using TypedefName = SomeType<OtherType, second, 5>;
что в вашем случае даст
template <class Type>
using vector3 = vector<Type, 3>;
Я не могу передать вам, как сильно я жаждал этого ;)
Однако это не решает проблему параметров. Как уже упоминалось, вы можете попробовать использовать вариативные шаблоны здесь, однако я не уверен в их применении в этом случае. Нормальное использование - с рекурсивными методами, и вам нужно будет бросить static_assert
посредине.
Отредактировано с учетом комментариев.
template <class Type, size_t Size>
class vector
{
public:
template <class... Args>
vector(Args... args): data({args...})
{
// Necessary only if you wish to ensure that the exact number of args
// is passed, otherwise there could be less than requested
BOOST_MPL_ASSERT_RELATION(sizeof...(Args), ==, Size);
}
private:
T data[Size];
};
Еще одна возможность, которая уже доступна, — объединить генерацию препроцессора с boost::enable_if
.
template <class Type, size_t Size>
class vector
{
public:
vector(Type a0, typename boost::enable_if_c< Size == 1 >::type* = 0);
vector(Type a0, Type a1, typename boost::enable_if_c< Size == 2 >::type* = 0);
// ...
};
Использование Boost.Preprocessor для генерации упрощает эту задачу.
BOOST_PP_REPEAT(MAX_COUNT, CONSTRUCTOR_MACRO, ~);
// where MAX_COUNT is defined to the maximum size you wish
// and CONSTRUCTOR_MACRO actually generates the constructor
#define CONSTRUCTOR_MACRO(z, n, data) \
vector( \
BOOST_PP_ENUM_PARAMS(n, Type a), \
typename boost::enable_if_c< Size == n >::type* = 0 \
);
Реализация конструктора оставлена читателю в качестве упражнения. Это еще один звонок BOOST_PP_REPEAT
.
Как видите, вскоре это становится уродливым, поэтому вам будет лучше, если вы сможете использовать версию шаблона с переменным числом аргументов.
person
Matthieu M.
schedule
15.07.2010