В C ++ 0x это будет действительно просто, но в настоящее время вы можете подойти к проблеме двумя способами: с помощью мета-функции или злоупотребления наследованием.
namespace NTL {
// metafunction
template <typename T>
struct vector_1 {
typedef std::valarray<T> type;
};
// inheritance abuse:
template <typename T>
struct vector_2 : std::valarray<T>
{};
}
int main() {
NTL::vector_1<double>::type var1; // type is std::valarray<double>
NTL::vector_2<double> var2; // type inherits from std::valarray<double>
}
Второй подход может быть легко расширен, но обратите внимание, что в общем случае не рекомендуется публично наследовать от контейнеров STL, поскольку они не предназначены для расширения. В частности, поскольку у них нет виртуального деструктора, вы можете получить неопределенное поведение, если ваш объект находится в delete
d от указателя на контейнер STL ...
Я бы посоветовал вам наследовать в частном порядке и перенести базовые функции-члены в область видимости посредством декларации using
(лучше, чем предоставление публичного наследования). Для этого потребуется больше кода, но вам не нужно будет предоставлять методы переадресации для всех желаемых интерфейсов.
Кстати, путь C ++ 0x будет:
namespace NTL {
template <typename T>
using vector = std::valarray<T>;
}