2015-10-20 5 views
4

Lorsque nous avons deux opérateurs pour la sortie d'un objet et un tableau de ces objets, et essayez de sortie tableau d'objets constants, l'opérateur pour les objets est impliqué. Est-il possible de forcer l'opérateur pour les tableaux à travailler avec des tableaux d'objets constants?sortie de const pointeur et tableau const

Exemple de code:

#include <iostream> 
#include <cstddef> 

using std::size_t; 

namespace nm 
{ 
    struct C { int i; }; 

    template <size_t N> 
    using c_c_array = C[N]; 

    inline std::ostream& operator << (std::ostream& lhs, C const*) { return lhs << "1\n"; } 

    template <size_t N> 
    inline std::ostream& operator << (std::ostream& lhs, c_c_array<N> const&) { return lhs << "2\n"; } 

} 

int main() 
{ 
    nm::C c{1}; 

    nm::C arr[5]; 

    nm::C const c_const{1}; 

    nm::C const arr_const[5] {{1}, {1}, {1}, {1}, {1}}; 

    std::cout << &c // 1 - ok 
      << arr // 2 - ok 
      << &c_const // 1 - ok 
      << arr_const; // 1 --ups 

    return 0; 
} 

sortie: 1 2 1 1

En outre, l'opérateur 2 dans mon cas utilise 1 pour la sortie.

+1

Ajouter initialiseurs à votre code afin que les gens cessent de répondre à la mauvaise question, par exemple 'c_const {};' et 'arr_const [5] {};' – Rostislav

+0

peu importe comment il est inicialized du tout pour la demande question. S'il s'agit d'un opérateur non officiel ou inalisé, l'opérateur 1 sera appelé. Ceci est juste un échantillon, je n'utilise pas cette constante pour rien, seulement pour illustrer l'ordre dans lequel les opérateurs ont appelé –

+0

Ugh. Voyez-vous les réponses que les gens vous donnent? Est-ce ce que vous cherchez? – Rostislav

Répondre

1

Je vais faire quelque chose comme montré ci-dessous pour le moment. Si quelqu'un sait mieux, écrivez-le s'il vous plaît.

#include <iostream> 
#include <cstddef> 
#include <type_traits> 

using std::size_t; 

namespace nm 
{ 
    struct C { int i; }; 

    template <size_t N> 
    using c_c_array = C[N]; 

    template<typename T> 
    inline 
    std::enable_if_t<std::is_same<T, C*>::value || std::is_same<T, C const*>::value, 
    std::ostream&> 
    operator << (std::ostream& lhs, T const&) { return lhs << "1\n"; } 

    template <size_t N> 
    inline std::ostream& operator << (std::ostream& lhs, c_c_array<N> const&) { return lhs << "2\n"; } 

} 

int main() 
{ 
    nm::C c{1}; 

    nm::C arr[5]; 

    nm::C const c_const{1}; 

    nm::C const arr_const[] {1,2,3,4,5}; 

    std::cout << &c // 1 - ok 
      << arr // 2 - ok 
      << &c_const // 1 - ok 
      << arr_const; // 1 --ups 

    return 0; 
} 
1

Selon le projet de norme N45278,5/P7.3 Initialiseur [dcl.init] (souligné dans):

  • Sinon, aucune initialisation est effectuée.

Si un programme appelle à l'initialisation par défaut d'un objet d'un type const qualifié T, T doit être un type de classe avec un constructeur par défaut fourni par l'utilisateur.

Ainsi, vous devez définir un constructeur par défaut pour class C pour que cela fonctionne.