2010-12-07 5 views
1

Voici ce que je voudrais faire:C++: Mélange: boost :: tout + typeid + pointeur: clone valeur « générique » si elle est un pointeur

  • D'un boost::any Je voudrais savoir est un type de pointeur.
  • S'il est un pointeur, je dois cloner

Quelque chose comme ceci:

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

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

Pensez-vous qu'il est possible?

Merci pour votre aide

NB: Je besoin de cela pour un cadre qui devrait être en mesure d'initialiser la valeur par défaut.

+2

'boost :: tout papier sur les problèmes de conception. Si vous travaillez sur un framework/une bibliothèque, vous devriez probablement éviter de l'utiliser. –

+0

Je suis d'accord avec Billy. Essayez d'utiliser un autre design si possible. Peut-être que boost :: variant correspondra à votre objectif? –

Répondre

0

Vous pouvez utiliser l'interface 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; 
} 

Retours

0 
1 
+1

Il n'y a rien de tel que 'std :: type_info :: __ is_pointer_p()' (http://www.cplusplus.com/reference/std/typeinfo/type_info/). Vous regardez probablement certains composants internes spécifiques au compilateur. –

+0

@Georg: True - extension GCC uniquement. –

+0

qu'en est-il de ends_with (val.type(). Name(), "*")? Peut-être devoir se déshabiller const, mais à part ça, ça devrait marcher (même si la norme n'est probablement pas très spécifique à ce sujet). – ltjax

1

Vous pouvez utiliser quelque chose comme ça (ne pas compiler):

#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_; } 
};