C ++: Смешивание: boost :: any + typeid + pointer: клонировать «универсальное» значение, если оно является указателем - PullRequest
1 голос
/ 07 декабря 2010

Вот что я хотел бы сделать:

  • Из boost::any Я хотел бы знать, что это тип указателя.
  • Если это указатель, я должен его клонировать

Примерно так:

boost::any value= new vector<string>();

if (typeid(value).IsPointerType())
{
  boost::any newValue = Clone(value);
}

Вы думаете, что это возможно?

Спасибо за вашу помощь

Примечание: это мне нужно для структуры, которая должна иметь возможность инициализировать значение по умолчанию.

Ответы [ 2 ]

1 голос
/ 07 декабря 2010

Вы можете использовать что-то вроде этого (не компилировать):

#include <boost/type_traits.hpp>

class any_p: public boost::any {
    const bool is_ptr_;
public:
    template<class T>
    any_p(T obj): boost::any(obj), is_ptr_(is_pointer<T>::value_type) {}
    const bool is_ptr() const { return is_ptr_; }
};
0 голосов
/ 07 декабря 2010

Вы можете использовать интерфейс type_info:

#include <boost/any.hpp>
#include <iostream>
#include <typeinfo>

using namespace std;

int main()
{
    boost::any intVal = 5;

    int* a = new int(6);
    boost::any ptrVal = a;

    cout << intVal.type().__is_pointer_p() <<endl;
    cout << ptrVal.type().__is_pointer_p() << endl; 

    return 0;
}

Возвращает

0
1
...