Здравствуйте, Angler, Вы писали:
A>Опять видимо глупый вопрос, но не могу допетрить как бы лучше сделать. Сразу простой надуманный пример и реализация на C++
[skipped]
Специализации обобщений в .NET не существует, это слишком иной механизм для такого средства как специализация шаблонов С++.
Какое конкретно обобщение требует специализации?
Ещё есть очень мегауродливый способ получить похожее поведение:
void DoSmth<T>(T arg)
{
if (typeof(T) == typeof(int))
{
int a = (int)(object) arg;
...
}
else if (typeof(T) == typeof(string)) ...
else ...
}
Но это всё перекладывается в рантайм и за такое убивают
Здравствуйте, Angler, Вы писали:
A>Опять видимо глупый вопрос, но не могу допетрить как бы лучше сделать. Сразу простой надуманный пример и реализация на C++
Ну на надуманный пример ответ будет простой — такого нет. А вот если приведете какой-нибудь реальный пример, то, возможно, решение и найдется.
Здравствуйте, Воронков Василий, Вы писали:
ВВ>Ну на надуманный пример ответ будет простой — такого нет. А вот если приведете какой-нибудь реальный пример, то, возможно, решение и найдется.
Приведу реальный пример:
Реализация значений в много языковой системе. Некоторые значения языкозависимые, некоторые нет. Для языкозависимых необходимо реализовать возможность получения значений для различных языков. В системе существует понятие основного языка. Вот примерный интерфейс:
class Value<Type>
{
//инициализируем словарь парами - (код языка; значение)
Value(XmlNode node){ ... }
//получение значения для основного языкаpublic Type getDefValue()
{
return this[DatatModel.defLID];
}
//получение значения для указанного языка
//если значение для указанного языка отсутствует, возвращаем значение для
//основного языкаpublic Type this[LanguageID lid]
{
get
{
Type value;
if (!m_impl.TryGetValue(lid, out value))
m_impl.TryGetValue(DatatModel.defLID, out value);
return value;
}
}
private Dictionary<LanguageID, Type> m_impl;
}
Ну и использовать планирую это всё хозяйство следующим образом:
class TypedAttribute<Type>
{
private Value<string> m_DisplayName;
public Value<string> DisplayName {get{return m_DisplayName;}}
public Value<string> m_Name;
public Value<string> Name {get{return m_Name;}}
public Value<Type> m_Value;
public Value<Type> Value {get{return m_Value;}}
}
Здравствуйте, Angler, Вы писали:
ВВ>>А вот если приведете какой-нибудь реальный пример, то, возможно, решение и найдется.
A>Приведу реальный пример: A>Реализация значений в много языковой системе. Некоторые значения языкозависимые, некоторые нет. Для языкозависимых необходимо реализовать возможность получения значений для различных языков.
А почему бы не использовать стандартные средства для локализации (глобализации, интернационализации) строковых литералов? Ну там ResourceManager и генерируемые Студией типобезопасные обёртки над ним.
A>В системе существует понятие основного языка.
Q>А почему бы не использовать стандартные средства для локализации (глобализации, интернационализации) строковых литералов? Ну там ResourceManager и генерируемые Студией типобезопасные обёртки над ним.
Планирую использовать шаблон Value также и с моими классами.
class CMObject
{
//...class CMDocument{};
//...public Value<CMDocument> document{...}
}
Значения грузятся из различных источников данных(бд, файлы) и не имеют с ресурсами ничего общего.
Если честно, видимо я не до конца понял пример. Генерик параметр у вас определяет тип ресурса, и логика от него не зависит (?) — я по крайней мере такого не вижу в принципе. Вам даже констрейнты не нужны, ибо генерик ничего с экземплярами типа не делает, просто достает их из коллекции. В итоге можете указывать любой тип без ограничений.
Весь приведенный вами код будет прекрасно работать за исключением:
public Value<Type> m_Value;
public Value<Type> Value {get{return m_Value;}}
Так конечно не получится. Генерик нужно явно специализировать. Но вы можете специализировать его с помощью интерфейса, описывающего контракт для приведения к другим типам — например, IConvertible.