Аналог специализации
От: Angler Россия  
Дата: 24.06.09 14:26
Оценка:
Опять видимо глупый вопрос, но не могу допетрить как бы лучше сделать. Сразу простой надуманный пример и реализация на C++

template<T>
class traits
{
  static T fromString(string str);
};

template<>
class traits<int>
{
  static int fromString(string str) { return str2int(str); }
};

template<>
class traits<my_generic_type>
{
  static my_generic_type fromString(string str) { return foo(str); }
};

template<typename T>
class value_t
{
public:
   explicit value(string str)
   {
      value = value_traits<T>::fromString(str);
   }

   T value;
};


Как бы выкрутить похожее на C#?

Спасибо и не бейте)
Re: Аналог специализации
От: Пельмешко Россия blog
Дата: 24.06.09 15:00
Оценка:
Здравствуйте, 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 ...
}
Но это всё перекладывается в рантайм и за такое убивают
Re: Аналог специализации
От: Воронков Василий Россия  
Дата: 24.06.09 16:20
Оценка: +1
Здравствуйте, Angler, Вы писали:

A>Опять видимо глупый вопрос, но не могу допетрить как бы лучше сделать. Сразу простой надуманный пример и реализация на C++


Ну на надуманный пример ответ будет простой — такого нет. А вот если приведете какой-нибудь реальный пример, то, возможно, решение и найдется.
Re[2]: Аналог специализации
От: Воронков Василий Россия  
Дата: 24.06.09 20:16
Оценка:
Здравствуйте, Пельмешко, Вы писали:

П>Ещё есть очень мегауродливый способ получить похожее поведение:

П>
П>void DoSmth<T>(T arg)
П>{
П>    if (typeof(T) == typeof(int))
П>    {
П>       int a = (int)(object) arg;
П>       ...
П>    }
П>    else if (typeof(T) == typeof(string)) ...
П>    else ...
П>}
П>
Но это всё перекладывается в рантайм и за такое убивают


Ну чтобы не убивали, а хотя бы просто калечили можно добавить констрейнт:

void DoSmth<T>(T arg) where T : IConvertible
Re[2]: Аналог специализации
От: Angler Россия  
Дата: 25.06.09 07:45
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Ну на надуманный пример ответ будет простой — такого нет. А вот если приведете какой-нибудь реальный пример, то, возможно, решение и найдется.


Приведу реальный пример:
Реализация значений в много языковой системе. Некоторые значения языкозависимые, некоторые нет. Для языкозависимых необходимо реализовать возможность получения значений для различных языков. В системе существует понятие основного языка. Вот примерный интерфейс:

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;}}
}
Re[3]: Аналог специализации
От: Qbit86 Кипр
Дата: 25.06.09 07:51
Оценка:
Здравствуйте, Angler, Вы писали:

ВВ>>А вот если приведете какой-нибудь реальный пример, то, возможно, решение и найдется.


A>Приведу реальный пример:

A>Реализация значений в много языковой системе. Некоторые значения языкозависимые, некоторые нет. Для языкозависимых необходимо реализовать возможность получения значений для различных языков.

А почему бы не использовать стандартные средства для локализации (глобализации, интернационализации) строковых литералов? Ну там ResourceManager и генерируемые Студией типобезопасные обёртки над ним.

A>В системе существует понятие основного языка.


Или в более общем виде — neutral culture.
Глаза у меня добрые, но рубашка — смирительная!
Re[4]: Аналог специализации
От: Angler Россия  
Дата: 25.06.09 08:05
Оценка:
Здравствуйте, Qbit86, Вы писали:


Q>А почему бы не использовать стандартные средства для локализации (глобализации, интернационализации) строковых литералов? Ну там ResourceManager и генерируемые Студией типобезопасные обёртки над ним.


Планирую использовать шаблон Value также и с моими классами.

class CMObject
{
  //...
  class CMDocument{};
  //...

  public Value<CMDocument> document{...}
}


Значения грузятся из различных источников данных(бд, файлы) и не имеют с ресурсами ничего общего.
Re[3]: Аналог специализации
От: Воронков Василий Россия  
Дата: 25.06.09 09:16
Оценка:
Здравствуйте, Angler, Вы писали:

Если честно, видимо я не до конца понял пример. Генерик параметр у вас определяет тип ресурса, и логика от него не зависит (?) — я по крайней мере такого не вижу в принципе. Вам даже констрейнты не нужны, ибо генерик ничего с экземплярами типа не делает, просто достает их из коллекции. В итоге можете указывать любой тип без ограничений.
Весь приведенный вами код будет прекрасно работать за исключением:

public Value<Type> m_Value;
public Value<Type> Value {get{return m_Value;}}

Так конечно не получится. Генерик нужно явно специализировать. Но вы можете специализировать его с помощью интерфейса, описывающего контракт для приведения к другим типам — например, IConvertible.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.