Выберите данное пространство имен во время выполнения - PullRequest
0 голосов
/ 09 апреля 2019

Скажем, у меня есть следующие пространства имен:

namespace old
{
std::array<std::string,1> characters {"old"};
}


namespace young 
{
std::array<std::string,1> characters {"young"};
}

Затем я хочу, чтобы пользователь сначала сказал мне, какую версию он использует.Затем вызовите соответствующее пространство имен во всей программе.

Я пробовал using namespace в зависимости от ввода, но это не работает, потому что мне нужно вызвать правильное пространство имен в функциях других исходных файлов.Я думал, может быть, я могу отправить пространство имен в качестве параметра функции?Или сделать что-нибудь умное с шаблонами?

EDIT: Когда я имею в виду «пользователя», я имею в виду кого-то, кто использует мой исполняемый файл, человека, играющего в мою игру.Я хочу спросить у него версию, которую он собирается использовать, например, версию для США (вещи имеют некоторые имена) или версию для Великобритании (вещи имеют другие имена).

Все, что меняется, - это имена, которые я использую,Но я хочу, чтобы он мог переключаться между версиями каждый раз.

Надеюсь, это понятно, пожалуйста, дайте мне знать, если вам нужны дальнейшие разъяснения.

Ответы [ 2 ]

1 голос
/ 09 апреля 2019

Нет способа передать пространство имен в качестве параметра функции или параметра шаблона. Пользователь может использовать его как:

using namespace old;

characters[0] = 'O';

или код как:

old::characters[0] = 'O';

ОБНОВЛЕНИЕ: после обновления исходного вопроса

Пространства имен актуальны во время компиляции и не отражают какого-либо поведения во время выполнения. Что вам нужно, так это:

enum Language
{
    ENGLISH_UK, ENGLISH_US
};

std::array<std::string, 2> label = {
    "colour", // for British-english
    "color"   // for US-English
};

А потом в коде:

static Language lang = ENGLISH_UK;

std::cout << label[lang] << std::endl;

Итак, если в пользовательском интерфейсе произошли изменения, вам не нужно перекомпилировать все приложение.

0 голосов
/ 09 апреля 2019

Короткий ответ - нет, потому что какие функции вызываются и к каким переменным обращаются в определенном месте вашего кода, когда вы, например, пишете characters, определяется во время компиляции.

Немного более длинный ответчто вы можете создавать функции-оболочки и ссылки в отдельном пространстве имен и пересылать их одному или другому в зависимости от пользователя (при условии, что типы одинаковы).

Например:

namespace current {
    int namespace_to_use = 1; // can be set by some initialization function in your code

    std::array<std::string,1>& get_characters(){
       return namespace_to_use == 0 ? old::characters : young::characters; 
    }
}

Я бы не назвал это хорошим дизайном приложения, и есть много более продвинутых / лучших версий этого (например, основанных на динамическом полиморфизме и фабричном шаблоне или указателях / ссылках).Что подходит лучше всего, зависит от ваших потребностей и вашего уровня опыта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...