о массиве указателей, используя шаблон в C ++ - PullRequest
0 голосов
/ 27 декабря 2011

у меня есть класс, показанный ниже:

template <class TValue>
    class ICData
    {
    private :
TValue value;
    public:
inline ICData()
{
};
TValue get_value();
void set_value(TValue data);
    };

    template <class TValue>
    TValue ICData<TValue>::get_value()
    {
return value;
    }

     template <class TValue>
     void ICData<TValue>::set_value(TValue _value)
     {
value=_value;
     }

Я знаю, как сделать массив указателей:

    ICData <int> *ICArray[10];
    ICArray[0]=new ICData<int>();
    ICArray[1]=new ICData<int>();

но есть ли способ создать массив указателей, используя шаблон? как ниже:

            template <class T>// iknow this code is WRONG
    ICData <T> *ICArray[10];
    ICArray[0]=new ICData<int>();
    ICArray[1]=new ICData<float>();

спасибо заранее.

Ответы [ 2 ]

1 голос
/ 27 декабря 2011

Вы не можете использовать этот подход для хранения как ICData<int>, так и ICData<float> в одном и том же ICArray.

. Он может работать, если вы извлечете ICData<T> из не-шаблонизированного ICDataBase, и используйте ICDataBase* ICArray[10].Однако статический тип будет утерян, поэтому скорее всего (вы захотите использовать сохраненное значение в какой-то момент, не так ли?), Это приведет к большому количеству приведений.

Другой вариант - использоватьboost::any.

Однако обычно существует лучший подход без использования boost :: any (хотя в некоторых случаях это оправдано).Поэтому я бы предложил сделать шаг назад и переосмыслить ваше решение.

1 голос
/ 27 декабря 2011

Если вы хотите сохранить указатель, который может указывать либо на ICData<int>, либо на ICData<float>, тогда эти типы должны иметь общий базовый класс, и вы можете использовать эту общую базу в качестве типа для указания.

В нынешнем виде тип ICData<int> и ICData<float> не связаны между собой, поэтому, кроме использования void *, не существует решения, которое вы хотите сделать, которое не включало бы некоторые уродливые приведения.

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