Общее объявление переменных-членов - PullRequest
0 голосов
/ 05 марта 2012

есть ли способ объявить множество переменных-членов из разных типов пользовательских данных в общем, используя оператор шаблона?

рассмотрите этот код:

    class a {
              int member;
             void ProcessMemberVariable ();
            };
    class b {
              char member;
             void ProcessMemberVariable ();
            };
... // arbitrary number of such classes



    class test {

    template <typename T>
    void declare (T a ) {
    // each time this member function is called a new member variable of the
    // user data type T shall be declared  in the instance of the class test?? 
    }
    };

int ()
{
test Test;
Test.template declare<a>(a A);
Test.template declare<b>(b B);
...
}

Представьте, что вы хотите реализовать интерфейс Apple для установки любого типа определенного пользователем типа данных. Поскольку я знаю идентификатор пользовательского типа данных только тогда, когда я объявляю экземпляр класса "test" и вызываю его функцию-член ...

Я ценю каждое предложение ..

Ответы [ 2 ]

2 голосов
/ 05 марта 2012

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

Однако, если вам известен список типов, которые вы, возможно, захотите добавить во время выполнения, вы можете добиться этого, используя boost :: variable. Ниже приведен тривиальный пример (

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

using namespace std;

class Test
{
    public:
       typedef boost::variant< long, double, string > VariantType;

       template< typename T > 
       void Declare( std::string name, T val )
       {
          VariantType newVal = val; 
          varMap.insert( std::make_pair( std::move( name ), std::move( val ) ) );
       }

       VariantType Get( const std::string& name )
       {
           return varMap[ name ];
       }

       template< typename T > 
       T GetValue( const std::string& name )
       {
          return boost::get<T>( varMap[name] );
       }

    private:
       std::map< string, VariantType > varMap;
};


int main()
{
    Test t{};

    t.Declare( "Var1", 10l );
    t.Declare( "pi",  3.14159);
    t.Declare( "AString",  "SomeName" );

    cout << "t.get( Var1 ) " << t.GetValue<long>( "Var1" ) << "\n";
    cout << "t.get( pi ) " << t.GetValue<double>( "pi" ) << "\n";
    cout << "t.get( AString ) " << t.GetValue<string>( "AString" ) << "\n";

    return 0;
}

См. http://www.boost.org/doc/libs/1_49_0/doc/html/variant.html для получения подробной информации о том, как использовать boost :: option.

2 голосов
/ 05 марта 2012

То, что вы описываете, звучит как динамическое добавление членов к объекту, а это невозможно в C ++. Существуют различные способы получения аналогичного эффекта в определенных ситуациях, но вам нужно будет описать ситуацию, когда вы считаете, что это будет полезно.

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