template <>
struct VariantConverter<Point<int>>
{ /* ... */ };
Здесь у вас есть шаблон специализация . Если вы хотите специализироваться, вам сначала понадобится базовый шаблон, прежде чем вы сможете скомпилировать.
template <typename>
struct VariantConverter;
Иногда бывает полезно, если только специализации существуют, тогда вы просто объявите базу, как указано выше, хотя обычно это имеет реализацию по умолчанию:
template <typename T>
struct VariantConverter
{
static T fromVar(var const& v);
};
Исключительно, что будет var
в вышеприведенном примере? Т как хорошо? Еще один параметр шаблона VariantConverter
struct? Третий вариант - это тот, который я показываю: параметр шаблона функции:
template <typename T>
struct VariantConverter
{
template <typename var>
static T fromVar(var const& v);
};
Теперь вы можете предоставить реализацию по умолчанию, подходящую для большинства типов & ndash; если является разумным (в противном случае, возможно, было бы более уместным не реализовывать стандартное значение и просто иметь специализации).
ОК, сейчас мы можем специализироваться:
template <>
struct VariantConverter<Point<int>>
// Point<int> now is what previously was T; could be any arbitrary type, not
// necessarily Point<int>, but std::string, double, ...
{
// still, you need to tell what var actually is
// maybe you have defined a class for already? similar to std::vector?
// assuming so this time...
static Point<int> fromVar (var const& v)
{
return Point<int>
(
// are you sure point accepts an initializer list?
// or do you intend to create first a point and then
// use move/copy constructor???
//{ v[0].operator int(), v[1].operator int() }
// rather normal constructor directly:
//v[0].operator int(), v[1].operator int()
// however, explicitly calling cast operators is ugly, rather just cast:
static_cast<int>(v[0]), static_cast<int>(<v[1])
// or C style casts, if you prefer
//(int)v[0], (int)v[1]
// I personally would rather go with the former, though, for being
// more "C++-ish"
);
}
};
Теперь, может быть, вы ищете что-то совершенно другое:
template <typename T>
struct VariantConverter
{
static Point<T> fromVar(std::vector<T> const& v)
{
return Point<T>(v[0], v[1]);
}
};
Наконец, как вы явно просили:
template <>
struct VariantConverter<Point<int>>
{
using Type = Point<int>;
static Type fromVar(/* ... */);
};
или, для второго варианта:
template <typename T>
struct VariantConverter
{
using Type = Point<T>;
static Type fromVar( /* ... */);
};