C++ динамический класс (динамический взлом)

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

=COUNTIF(Sheet1!A:A,"<>")

Я полагаю, вы понимаете COUNTIF()

Условие "<>" в основном означает «не равно пустому / ничему» , поэтому «посчитайте все, что не пусто»

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

5
задан AstroCB 30 August 2014 в 21:09
поделиться

5 ответов

Используйте карту и вариант.

Например, использование повышения:: вариант. См. http://www.boost.org/doc/libs/1_36_0/doc/html/variant.html

(Но конечно, можно создать собственное, для удовлетворения типам атрибутов XML.)

#include <map>
#include <boost/variant.hpp>

typedef boost::variant< int, std::string > MyValue ;
typedef std::map<std::string, MyValue> MyValueMap ;

Путем добавления MyValueMap как член класса можно добавить свойства согласно их именам. Что означает код:

oMyValueMap.insert(std::make_pair("newField", 44)) ;
oMyValueMap.insert(std::make_pair("newField2", "Hello World")) ;
std::cout << oMyValueMap["newField"] ;
std::cout << oMyValueMap["newField2"] ;

Путем инкапсуляции его в классе MyObject и добавления права перегрузил средства доступа в этом классе MyObject, код выше становится несколько более четким:

oMyObject.addField("newField", 44) ;
oMyObject.addField("newField2", "Hello World") ;
std::cout << oMyObject["newField"] ;
std::cout << oMyObject["newField2"] ;

Но Вы теряете несколько безопасность типов C++, делающего так. Но для XML, это неизбежно, я предполагаю.

13
ответ дан 18 December 2019 в 07:11
поделиться

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

Но см. Универсальный Шаблон разработки.

4
ответ дан 18 December 2019 в 07:11
поделиться

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

template< typename T > T get_member( string name );
template< typename T > void set_member( string name, T value );

Вы могли сделать синтаксис более компактным/хитрым, если Вы хотите (например: использование '->' переопределение оператора). Существуют также некоторые определенные для компилятора приемы, которые Вы могли возможно усилить (поддержки MSVC __ declspec (свойство), например, который позволяет Вам отображать ссылки на членскую переменную к методам определенного формата). В конце дня, тем не менее, Вы не собираетесь быть способными сделать что-то, что компилятор не принимает на языке и заставляет его компилировать.

3
ответ дан 18 December 2019 в 07:11
поделиться

Короткая версия: не Может сделать этого. Нет никакой собственной поддержки этого, C++ со статическим контролем типов, и компилятор должен знать, что структура каждого объекта управляется.

Рекомендация: Используйте встроенное межболее дерзкое. И не пишите свое собственное (см. ниже), получите тот, который уже работает и отлаженный.


Что можно сделать: Реализуйте как раз достаточно межболее дерзкое для Ваших потребностей.

Было бы достаточно просто установить класс с элементом данных как

std::vector<void*> extra_data;

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

size_t add_data_link(void *p); // points to existing data, returns index
size_t add_data_copy(void *p, size_t s) // copies data (dispose at
                                        // destruction time!), returns 
                                        // index 
void* get_data(size_t i); //...

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

2
ответ дан 18 December 2019 в 07:11
поделиться

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

0
ответ дан 18 December 2019 в 07:11
поделиться
Другие вопросы по тегам:

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