Использовать таги или флажки
От: Sergey J. A. Беларусь  
Дата: 11.11.04 14:01
Оценка:
Заметил что коллега использует таги в своём коде:

struct no_copy_tag {};
extern no_copy_tag no_copy;

class VariantWrp
{
public:
   VariantWrp();
   VariantWrp(VARIANT &vt);
   VariantWrp(no_copy_tag &, VARIANT &vt);
};

// Using:
VariantWrp var1;
VariantWrp var2(vtSource);
VariantWrp var3(no_copy, vtSource);


Я вижу такую альтернативу:
class VariantWrp
{
public:
   VariantWrp();
   VariantWrp(VARIANT &vt, bool bCopy = true);
};

// Using:
VariantWrp var1;
VariantWrp var2(vtSource);
VariantWrp var3(vtSource, false);


Какой случай когда лучше применять ?
Я — свихнувшееся сознание Джо.
Re: Использовать таги или флажки
От: Centaur Россия  
Дата: 11.11.04 16:37
Оценка:
Здравствуйте, Sergey J. A., Вы писали:

SJA>Заметил что коллега использует таги в своём коде:


SJA>
SJA>VariantWrp var1;
SJA>VariantWrp var2(vtSource);
SJA>VariantWrp var3(no_copy, vtSource);
SJA>


SJA>Я вижу такую альтернативу:

SJA>
SJA>VariantWrp var1;
SJA>VariantWrp var2(vtSource);
SJA>VariantWrp var3(vtSource, false);
SJA>


SJA>Какой случай когда лучше применять ?


void f(/*неважно*/, bool flag)
{
  // много кода…
  // очень много кода…
  // общего для обоих случаев кода…
  if (flag) /*частный случай 1*/; else /*частный случай 2*/;
  // ещё очень много кода…
}

void g(/*пофигу*/)
{
  // много кода для частного случая 1
}

void g(tag_t, /*пофигу*/)
{
  // много другого кода для случая 2
  // который совсем не похож на код случая 1
}


Опять же, overload разрешится при компиляции, а флаг — только в рантайме.
Re[2]: Использовать таги или флажки
От: Sergey J. A. Беларусь  
Дата: 11.11.04 16:56
Оценка:
Здравствуйте, Centaur, Вы писали:

C>
C>void f(/*неважно*/, bool flag)
C>{
C>  // много кода…
C>  // очень много кода…
C>  // общего для обоих случаев кода…
C>  if (flag) /*частный случай 1*/; else /*частный случай 2*/;
C>  // ещё очень много кода…
C>}

C>void g(/*пофигу*/)
C>{
C>  // много кода для частного случая 1
C>}

C>void g(tag_t, /*пофигу*/)
C>{
C>  // много другого кода для случая 2
C>  // который совсем не похож на код случая 1
C>}
C>


C>Опять же, overload разрешится при компиляции, а флаг — только в рантайме.


Т.е. я так понял, что можно ориентироваться по степени сходства кода ?
А в чём может проявляется преимущество тагов ? Я что-то не могу придумать случай, когда нужен выбор в компайл тайм ?
Я — свихнувшееся сознание Джо.
Re[3]: Использовать таги или флажки
От: Centaur Россия  
Дата: 12.11.04 17:03
Оценка:
Здравствуйте, Sergey J. A., Вы писали:

C>>Опять же, overload разрешится при компиляции, а флаг — только в рантайме.


SJA>Т.е. я так понял, что можно ориентироваться по степени сходства кода ?

SJA>А в чём может проявляется преимущество тагов ? Я что-то не могу придумать случай, когда нужен выбор в компайл тайм ?

Если функция вызывается много раз в большом цикле, то многократная проверка флага понизит быстродействие.
Re[4]: Использовать таги или флажки
От: Михаил Трухманов Россия  
Дата: 15.11.04 08:15
Оценка:
Здравствуйте, Centaur, Sergey J. A.

Так если проверка нужна в compile-time, можно с тем же успехом дать функциям разные имена, сделав при этом одинаковые параметры, правда ведь?
Re[5]: Использовать таги или флажки
От: Sergey J. A. Беларусь  
Дата: 15.11.04 11:26
Оценка:
Здравствуйте, Михаил Трухманов, Вы писали:

МТ>Так если проверка нужна в compile-time, можно с тем же успехом дать функциям разные имена, сделав при этом одинаковые параметры, правда ведь?


С конструкторами это не прокатывает
Я — свихнувшееся сознание Джо.
Re[6]: Использовать таги или флажки
От: Михаил Трухманов Россия  
Дата: 15.11.04 14:56
Оценка:
Здравствуйте, Sergey J. A., Вы писали:

SJA>С конструкторами это не прокатывает


Блин, читал ветку четыре дня назад -- на конструктор в примере не обратил особого внимания. А сегодня ответил на конкретное сообщение про "функцию", и облажался.

А по теме, думаю, единственное, когда это надо --- если хочется обязательно в compile-time выбрать. Причем, для твоего примера, похоже, почти всегда уже при компиляции можно определится, копировать или нет.
Вопрос только, надо ли связываться с тегом при первой же возможности.
Можно это делать ради быстродействия (сомневаюсь, что выигрыш будет заметен).
Можно просто из идеологических соображений (все что можно сделать при компиляции, не надо откладывать до run-time).
Но мне кажется, на идеологию можно "положить", чтобы код проще был --- пусть компилятор оптимизирует.

Это все конечно не относится к случаю, когда кода очень много и он совсем отличается.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.