Информация об изменениях

Сообщение Re[6]: Список целых на этапе компиляции с проверкой от 27.12.2017 13:27

Изменено 27.12.2017 15:43 watchmaker

Re[6]: Список целых на этапе компиляции с проверкой
Здравствуйте, rg45, Вы писали:

R>Сразу обрати внимание на ограничение: такие специализации можно сделать либо в том же, либо в обрамляющем пространстве имен (с явной спецификацией пространства имен). Если окажется, что "использование" происходит в каком-нибудь вложенном или несвязанном пространстве имен, то это может серьезно осложнить задачу. И в области видимости классов специализации делать не разрешается по стандарту, хоть некоторые компиляторы (msvc, например) и поддерживают эту возможность.


Зачем делать явную специализацию? Это какое-то ненужное переусложнение.

Достаточно в месте "использования" потрогать переменную любым способом (который ODR-used).
Ну то есть написать в once.h
#pragma once 
template <typename T> int instance_me_only_once = 0;

А потом в люом месте включать этот заголовочный файл и трогать переменную:
#include <once.h>

namespace Whatever {
  template <class Foo>
  struct Bar {
    Bar() {
      ++instance_me_only_once<Foo>; 
      Use<Foo>();
    }
  }
}


Теперь если в другой единице трансляции тоже сделать ++instance_me_only_once<Foo>, то программа не соберётся.
Re[6]: Список целых на этапе компиляции с проверкой
Здравствуйте, rg45, Вы писали:

R>Сразу обрати внимание на ограничение: такие специализации можно сделать либо в том же, либо в обрамляющем пространстве имен (с явной спецификацией пространства имен). Если окажется, что "использование" происходит в каком-нибудь вложенном или несвязанном пространстве имен, то это может серьезно осложнить задачу. И в области видимости классов специализации делать не разрешается по стандарту, хоть некоторые компиляторы (msvc, например) и поддерживают эту возможность.



Зачем делать явную специализацию? Это какое-то ненужное переусложнение.

Достаточно в месте "использования" потрогать переменную любым способом (который ODR-used).
Ну то есть написать в once.h
#pragma once 
template <typename T> int instance_me_only_once = 0;

А потом в люом месте включать этот заголовочный файл и трогать переменную:
#include <once.h>

namespace Whatever {
  template <class Foo>
  struct Bar {
    Bar() {
      ++instance_me_only_once<Foo>; 
      Use<Foo>();
    }
  }
}


Теперь если в другой единице трансляции тоже сделать ++instance_me_only_once<Foo>, то программа не соберётся.