在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
。正如你所看到的,它很快變得醜陋,所以如果你可以使用可變模板版本,你會變得更好。
sizeof ...(Args)的模板參數個數? – Tomek 2010-07-15 17:25:11
也許,我從來沒有需要它,我找不到任何參考... – 2010-07-15 17:35:33
通過使用初始化程序列表:'data({args ...})'擺脫您的'init'函數 – phlipsy 2010-07-15 20:06:22