переключить пространство имен, если условие - PullRequest
1 голос
/ 17 января 2011

в моей программе на C ++ у меня есть несколько пространств имен, которые содержат несколько указателей с одинаковыми именами. Затем я хочу, чтобы функция выбрала пространство имен в соответствии с параметром. То есть что-то вроде:

#include <iostream>

namespace ns1{
double x[5]={1,2,3,4,5};
}
namespace ns2{
double x[5]={6,7,8,9,10};
}

int main(){
  int b=1;
  if(b==1){
    using namespace ns1;
  }
  if(b==2){
    using namespace ns2;
  }
  std::cout << x[3] << std::endl;
}

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

int main(){
  int b=1;
  double *x;
  if(b==1){
    x = ns1::x;
  }
  if(b==2){
    x = ns2::x;
  }
  std::cout << x[3] << std::endl;
}

Ура, Pascal

Ответы [ 7 ]

4 голосов
/ 17 января 2011

Пространства имен являются функцией времени компиляции в C ++, вы не можете манипулировать ими динамически во время выполнения.Лучший совет, который я могу вам дать, - это попробовать другой подход - пространства имен, вероятно, не предназначены для того, что вы хотите делать.Поэтому спросите ТАК, что вы действительно хотите сделать, и вы, вероятно, получите хороший ответ, не перегибая систему.

1 голос
/ 17 января 2011

В простейшем состоянии у вас есть «статические» данные, но вы хотите решить, какой фрагмент статических данных использовать.

struct space
{
  double x[5];
};

space space1 = space{ {1,2,3,4,5} };
space space2 = space{ {6,7,8,9,10} };

int main( int argc, char * argv[] )
{
   space * s;
   if( argc == 1 )
       s = &space1;
   else
       s = &space2;
}

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

Выможет использовать полиморфизм для реализации функций, но это во многом зависит от того, для чего он вам нужен.

1 голос
/ 17 января 2011

Я не понимаю, почему вы не хотите этого:

double* dispatch(int b)
{
    switch(b)
    {
        case 1: return ns1::x;
        case 2: return ns2::x;
        default: return 0;
    }
}

int main()
{
    int b=1;
    std::cout << dispatch(b)[3] << std::endl;
}

Если это будет расти, рассмотрите возможность использования классов и полиморфизма вместо пространств имен.

1 голос
/ 17 января 2011

Пространство имен используется во время компиляции. Состояние if не выполняется во время выполнения.

Вы не можете переключать поведение компилятора во время выполнения.

0 голосов
/ 17 января 2011

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

// Header file
class s
{
  public:
    double x[5];
}

class s1: public s 
{
  public:
    s1() { /* Assign x here */ };        
}

class s2: public s
{
  public:
    s2() { /* Assign x here */ };
}

// CPP file
int main()
{
  int b = 1;
  s* sptr;

  if (b == 1)
    sptr = (s*)new s1();
  else
    sptr = (s*)new s2();

  std::cout << sptr->x[3] << std::endl;
  delete sptr;
} 

Если у вас есть только несколько переменных, вы можете использовать указатели.

int main()
{
  int b = 1;
  double *px;
  double s1x = {1, 2, 3, 4, 5};
  double s2x = {6, 7, 8, 9, 10};

  if (b == 1)
    px = &s1x;
  else
    px = &s2x;

  std::cout << px[3] << std::endl;
}
0 голосов
/ 17 января 2011

директивы using namespace в основном говорят компилятору "попытаться использовать это при разрешении символов", чего не происходит во время выполнения.

Я не вижу проблем со вторым подходом....

0 голосов
/ 17 января 2011

Я не верю, что пространства имен - это то, что определяется во время выполнения ... поэтому вы не сможете настроить его как таковое.

Быстрый Google "изменение пространства имен во время выполнения" вернул http://www.velocityreviews.com/forums/t288720-changing-namespace-at-runtime.html

Надеюсь, это поможет.

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