Предоставление неуправляемой const static std :: string в управляемом классе C ++ - PullRequest
2 голосов
/ 19 ноября 2009

У меня не-.NET C ++ класс выглядит следующим образом:

foo.h:

namespace foo {
  const static std::string FOO;
  ...
}

Foo.cc:

using namespace foo;

const std::string FOO = "foo";

Я хочу показать это для использования в приложении C #, но продолжаю получать ошибки о смешанных типах, когда пытаюсь выполнить следующее:

FooManaged.h:

namespace foo {
  namespace NET {
    public ref class Foo {
      public:
        const static std::string FOO;
    }
  }
} 

FooManaged.cc:

using namespace foo::NET;

const std::string Foo::FOO = foo::FOO;

Как правильно преобразовать неуправляемую строковую константу в управляемую строковую константу?

1 Ответ

3 голосов
/ 22 ноября 2009

В C ++ / CLI ключевое слово literal используется вместо static const, где требуется, чтобы определение константы было включено в интерфейс, доступный для полностью управляемых приложений.

public:
    literal String^ Foo = "foo";

К сожалению, literal требует немедленного значения, поэтому использование значения std::string невозможно. В качестве альтернативы вы можете создать статическое свойство только для чтения, которое возвращает строку.

public:
    static property String^ Foo
    {
        String^ get()
        {
            return gcnew String(Foo::FOO.c_str()); 
        }
    }

Лично я считаю, что переписать строку снова и использовать literal - лучший вариант. Однако, если вас очень беспокоит постоянное изменение (например, в более новой версии), свойство будет использовать версию FOO в собственной библиотеке.

...