Как смягчить влияние API-интерфейса на общедоступные элементы в шаблонных классах?
Допустим, у меня есть тип таблицы поиска, которую я могу построить для данного целого числа:
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
сами случаи были статичными? : - /