Как смягчить влияние 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 сами случаи были статичными? : - /

Ответы на вопрос(2)

Ваш ответ на вопрос