Допустим, у меня есть тип таблицы поиска, которую я могу построить для данного целого числа:
class FooLookupTable {
...
public:
FooLookupTable(int radix) {
...
}
};
Тогда есть класс, параметр шаблона которого является тем же целым числом, и конструктор которого инициализирует экземпляр члена этой таблицы поиска:
template <int radix> class Foo {
...
private:
FooLookupTable table;
public:
Foo () : FooLookupTable (radix) {
...
}
};
Во всем коде я создаю их с различными значениями radix:
int main() {
...
Foo<1> myFoo;
Foo<1> yourFoo;
Foo<10> theirFoo;
...
}
Это работает и не создает проблем с потоками или API. Но он не делит таблицу радиусов на 1 между myFoo
и yourFoo
. Я мог бы жестко закодировать зависимость от предполагаемой библиотеки потоков и создать глобальную карту, заполненную по требованию. Но мой вопрос:
"В современном мире C ++ 11 есть ли чистый способ разработки библиотеки для Foo, у которой нет зависимостей вне стандартных библиотек?"
Я подумал об использовании статического члена для этого, поскольку каждое отдельное создание экземпляра класса шаблона создает только одну статическую переменную-член . Но это поднимает вопрос о том, кто отвечает за объявление пространства для статического члена и , кто бы это ни делал, должен «знать правильный способ его инициализации»:
FooLookupTable Foo<1>::table (1);
FooLookupTable Foo<10>::table (10);
int main() {
...
Foo<1> myFoo;
Foo<1> yourFoo;
Foo<10> theirFoo;
...
}
Чтение того, что написано на эту тему, типа " C ++ Статическая инициализация члена (забавный шаблон внутри) * ", похоже, не вселяет особой надежды ... если только я что-то упустил Кроме того, что произойдет, если Foo
сами экземпляры будут статичными? : - /