Области применения с предварительно созданным пространством имен (C ++) - PullRequest
4 голосов
/ 13 декабря 2011

Чтобы избежать определения области действия STL, вы можете набрать

using namespace std;

Чтобы избежать определения только нескольких вещей, вы можете набрать:

using std::cout;  
using std::cin;

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

Так, например, я кодирую:

  • Коллекция строковых функций
  • Сборник математических функций

Они являются частью одного и того же пространства имен, но я могу включить куски, которые я хочу


Это код sudo-ish, но я думаю, что он понял мою идею:

namespace Everything{
    namespace StringFunctions{
        void str1(string & str);
        void str2(string & str);
        void str3(string & str);
        void str4(string & str);
        void str5(string & str);
    }

    namespace MathFunctions {
        void math1(int & num);
        void math2(int & num);
        void math3(int & num);
        void math4(int & num);
        void math5(int & num);
    }
}

тогда я хочу иметь возможность сделать что-то вроде:

#include "Everything.h"
using Everything::Stringfunctions;

int main(){

    str1("string"); //this works, I can call this!
    math1(111);     //compile error: I've never heard of that function!

    return 0;
}

Очевидно, что это не работает, и я немного запутался, как разделить мою библиотеку. Я не хочу делать их классами, а затем везде использовать «оператор точки», но я также не хочу включать тонну заголовочных файлов.

Может быть, я поступаю неправильно. Я надеюсь, что каждый может помочь мне выбрать правильный подход.


EDIT:

Работает, написав:

using namespace Everything::Stringfunctions;

Это очень очевидно сейчас, оглядываясь назад.

Ответы [ 3 ]

3 голосов
/ 13 декабря 2011

Достаточно того, как вы написали свою библиотеку в приведенном вами примере.

Люди могут получить любую функцию из пространства имен Everything::Stringfunctions, используя директиву using namespace Everything::Stringfunctions.

0 голосов
/ 13 декабря 2011

То, что вы хотите, работает, при условии, что вы используете using namespace, а не просто using.См. здесь (программа компилирует и выводит '5').

0 голосов
/ 13 декабря 2011

Вы должны рассмотреть возможность разделения функциональности на разные заголовки независимо, в противном случае вы получите кошмарное время компиляции.Тем не менее, я думаю, using namespace Everything::Stringfunctions; должен сделать это (с дополнительными namespace там. Я не пытался компилировать, хотя).

...