используйте std :: vector & lt; char & gt; в C ++ / cLi [дубликат]

Несмотря на то, что в ES2015 поддерживаются только статические методы (а не статические свойства) (см. здесь , раздел 15.2.2.2), с любопытством вы можете использовать ниже с Babel с предустановкой es2015:

class CellState {
    v: string;
    constructor(v: string) {
        this.v = v;
        Object.freeze(this);
    }
    static EMPTY       = new CellState('e');
    static OCCUPIED    = new CellState('o');
    static HIGHLIGHTED = new CellState('h');
    static values      = function(): Array {
        const rv = [];
        rv.push(CellState.EMPTY);
        rv.push(CellState.OCCUPIED);
        rv.push(CellState.HIGHLIGHTED);
        return rv;
    }
}
Object.freeze(CellState);

Я нашел, что это работает как ожидалось даже через модули (например, импортирование перечисления CellState из другого модуля), а также при импорте модуля с использованием Webpack.

Преимущество этого метода в большинстве других ответов заключается в том, что вы можете использовать его наряду с проверкой статического типа (например, Flow ), и вы можете утверждать, что во время разработки, используя статические проверки типа, что ваши переменные, параметры и т. д. относятся к конкретному CellState «перечислению», а не к другому перечислению (что было бы невозможно отличить, если вы использовали общие объекты или символы).

update

В приведенном выше коде есть недостаток в том, что он позволяет создавать дополнительные объекты типа CellState (даже если они не могут назначить их статическим полям CellState, поскольку они заморожены). Тем не менее, более совершенный код имеет следующие преимущества:

  1. не может быть создано больше объектов типа CellState
  2. , вам гарантировано, что не назначены два экземпляра перечисления тот же самый код
  3. метод утилиты, чтобы получить перечисление обратно из строкового представления
  4. , функция values, которая возвращает все экземпляры перечисления, не должна создавать возвращаемое значение в выше, ручной (и подверженный ошибкам) ​​способ.
    'use strict';
    
    class Status {
    
    constructor(code, displayName = code) {
        if (Status.INSTANCES.has(code))
            throw new Error(`duplicate code value: [${code}]`);
        if (!Status.canCreateMoreInstances)
            throw new Error(`attempt to call constructor(${code}`+
           `, ${displayName}) after all static instances have been created`);
        this.code        = code;
        this.displayName = displayName;
        Object.freeze(this);
        Status.INSTANCES.set(this.code, this);
    }
    
    toString() {
        return `[code: ${this.code}, displayName: ${this.displayName}]`;
    }
    static INSTANCES   = new Map();
    static canCreateMoreInstances      = true;
    
    // the values:
    static ARCHIVED    = new Status('Archived');
    static OBSERVED    = new Status('Observed');
    static SCHEDULED   = new Status('Scheduled');
    static UNOBSERVED  = new Status('Unobserved');
    static UNTRIGGERED = new Status('Untriggered');
    
    static values      = function() {
        return Array.from(Status.INSTANCES.values());
    }
    
    static fromCode(code) {
        if (!Status.INSTANCES.has(code))
            throw new Error(`unknown code: ${code}`);
        else
            return Status.INSTANCES.get(code);
    }
    }
    
    Status.canCreateMoreInstances = false;
    Object.freeze(Status);
    exports.Status = Status;
    

2
задан Aesthete 5 December 2012 в 09:22
поделиться

2 ответа

Googling показывает marshal_as (untested):

// marshal_as_test.cpp
// compile with: /clr
#include <stdlib.h>
#include <string>
#include <msclr\marshal_cppstd.h>

using namespace System;
using namespace msclr::interop;

int main() {
   std::string message = "Test String to Marshal";
   String^ result;
   result = marshal_as<String^>( message );
   return 0;
}

Также см. Обзор маршалинга .

6
ответ дан Mark Tolonen 28 August 2018 в 18:15
поделиться

Из MSDN:

#include <string>
#include <iostream>
using namespace System;
using namespace std;

int main() {
   string str = "test";
   String^ newSystemString = gcnew String(str.c_str());
}

http://msdn.microsoft.com/en-us/library/ms235219.aspx

5
ответ дан Teodor Ciuraru 28 August 2018 в 18:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: