pa variar

10 views
Skip to first unread message

Daniel Gutson

unread,
Apr 28, 2012, 8:21:00 PM4/28/12
to cppba
Qué pasa con esto

class Pepe
{
    template <class T>
    virtual void jodida();

    template <class T>
    virtual void mas_jodida() = 0;
};

Quisiera ver razonamientos mentalmente deliciosos.

--
Who’s got the sweetest disposition?
One guess, that’s who?
Who’d never, ever start an argument?
Who never shows a bit of temperament?
Who's never wrong but always right?
Who'd never dream of starting a fight?
Who get stuck with all the bad luck?

Alejandro Santos

unread,
Apr 28, 2012, 8:45:46 PM4/28/12
to cp...@googlegroups.com
Ninguna de las dos virtuals tienen parametros y ambas retornan void.
El compilador puede ignorar el template<class T> y compilar
normalmente.

2012/4/28 Daniel Gutson <daniel...@gmail.com>:
> --
> ¿Eres miembro de "CyC++ Buenos Aires" verdad? Si no lo eres, has recibido
> este mesaje por error.
> En caso de duda visita "http://groups.google.com/group/cppba"



--
Alejandro Santos

Daniel Gutson

unread,
Apr 28, 2012, 9:00:33 PM4/28/12
to cp...@googlegroups.com


2012/4/28 Alejandro Santos <ale...@gmail.com>

Ninguna de las dos virtuals tienen parametros y ambas retornan void.
El compilador puede ignorar el template<class T> y compilar
normalmente.

?

template <class Tapado>
void f()
{
    cout << sizeof(Tapado);
}


f<int>() != f<char>()

sole

unread,
Apr 29, 2012, 1:45:08 AM4/29/12
to cp...@googlegroups.com
Veo dos cosas
1. una función miembro templetizada no puede ser virtual.... esto no compila en VS.
es que por cada instancia del template debería haber una entrada en la vtable de la clase, y como las instanciaciones se pueden hacer en diferentes unidades de compilación, es el linker el que debería armar la vtable, y esto no ocurre porque ya nos dijiste Daniel que los creadores de los linkers son vagos :P


2. por qué tenes dos funciones virtuales privadas? no veo ningún problema con la vtable con que sean privadas, imagino que se construye lo mismo pero en términos de diseño, cuando querríaa usar algo asi?
(imagino que fue sin querer, pero ya que estamos :P)

Bss,
Sole

--

Jose Angel Bustamante

unread,
Apr 29, 2012, 11:01:04 AM4/29/12
to cp...@googlegroups.com
Hola,
 
Todavía me suenta muy controversial, si no contradictorio, el hecho de ser template and virtual al mismo tiempo.
 
Los Templates tienen que ver con la generación de código en tiempo de compilación; las funciones virtuales tienen que ver con que la idea de cuál función hay que llamar en tiempo de ejecución. Cuando el run-time se da cuenta de que debe llamar a una función templetizada, el compilador ya no puede generar la instancia apropiada..  A menos que me haya perdido de algo ??
 
Por las dudas, como todavía hay algunos conflictos entre la OOP y la programación genérica, este artículo puede ser interesante: Object-Oriented and Generic Programming in C++
 
 
Saludos,
José Angel Bustamante



2012/4/29 sole <soledad...@gmail.com>

Daniel Gutson

unread,
Apr 29, 2012, 1:39:52 PM4/29/12
to cp...@googlegroups.com


2012/4/29 Jose Angel Bustamante <ange...@gmail.com>

Hola,
 
Todavía me suenta muy controversial, si no contradictorio, el hecho de ser template and virtual al mismo tiempo.
 
Los Templates tienen que ver con la generación de código en tiempo de compilación; las funciones virtuales tienen que ver con que la idea de cuál función hay que llamar en tiempo de ejecución.
 
Cuando el run-time se da cuenta de que debe llamar a una función templetizada,

Nadie en run-time se entera de que existen o existieron los templates, no queda rastro alguno de ellos porque se resolvieron en tiempo de compilación ( o de linking en algunos casos).

La Sole mandó la posta.

Daniel Gutson

unread,
Apr 29, 2012, 1:43:08 PM4/29/12
to cp...@googlegroups.com
Además, acá envío un ejemplo de combinación de templates con virtual:

struct Interfaz
{
    virtual string stringize() const = 0;
};

template <class T>
class TemplateBasedImplementation : public Interfaz
{
    const T t;
    virtual string stringize() const
    {
        stringstream ss;
        ss << t;
        return ss.str();
    }
public:
     TemplateBasedImplementation( T _t ) : t( _t ) {}
};

2012/4/29 Daniel Gutson <daniel...@gmail.com>

Fernando Pelliccioni

unread,
Apr 29, 2012, 2:26:48 PM4/29/12
to cp...@googlegroups.com
2012/4/29 Jose Angel Bustamante <ange...@gmail.com>
Hola,
 
Todavía me suenta muy controversial, si no contradictorio, el hecho de ser template and virtual al mismo tiempo.
 
Los Templates tienen que ver con la generación de código en tiempo de compilación; las funciones virtuales tienen que ver con que la idea de cuál función hay que llamar en tiempo de ejecución. Cuando el run-time se da cuenta de que debe llamar a una función templetizada, el compilador ya no puede generar la instancia apropiada..  A menos que me haya perdido de algo ??
 
Por las dudas, como todavía hay algunos conflictos entre la OOP y la programación genérica, este artículo puede ser interesante: Object-Oriented and Generic Programming in C++
 

Justo iba a responder con el mismo artículo.

Tambíen está bueno leer a Bjarne Stroustrup en "The design and evolution of C++" donde explica "-virtual- member templates" (15.9.3), que en definitiva es lo mismo que lo que dijo Sole.

(semi OT)  En otros lenguajes sí es posible.
En C# donde los tipos genéricos se resuelven en runtime ( JIT, etc...) (no me maten si no es técnicamente exacto) no tenemos problema en este caso.
En Java el tipo genérico es eliminado.
--En Eiffel creo que solo existe genericidad pero aplicado a clases.--

Saludos,
FP

Daniel Gutson

unread,
Apr 29, 2012, 2:37:41 PM4/29/12
to cp...@googlegroups.com


2012/4/29 Fernando Pelliccioni <fpelli...@gmail.com>
pero tienen otros problemas fundamentalmente más críticos... empezando por ser C#   :D

(okokok, perdón, me fue más fuerte q yo... volvemos al thread)
 
En Java el tipo genérico es eliminado.
--En Eiffel creo que solo existe genericidad pero aplicado a clases.--

Saludos,
FP

--
¿Eres miembro de "CyC++ Buenos Aires" verdad? Si no lo eres, has recibido este mesaje por error.
En caso de duda visita "http://groups.google.com/group/cppba"

Fernando Pelliccioni

unread,
Apr 29, 2012, 2:57:19 PM4/29/12
to cp...@googlegroups.com

Sí sí, seguro que sí.
No quiero decir que un diseño es mejor que el otro sino marcar las diferencias.
Me quedo con la de c++ toda la vida :)

Fernando Pelliccioni

unread,
Apr 29, 2012, 2:59:25 PM4/29/12
to cp...@googlegroups.com

Es más.. Traten de hacer una clase matriz genérica en c# sin recurrir a chanchadas en runtime

Juan Manuel Ollé

unread,
Apr 29, 2012, 6:31:48 PM4/29/12
to cp...@googlegroups.com
14.5.2.3 del standard 14882-2003

A member function template shall not be virtual.
[Example:
template <class T> struct AA {
template <class C> virtual void g(C); // error
virtual void f(); // OK
};

sole

unread,
Apr 30, 2012, 2:02:52 PM4/30/12
to cp...@googlegroups.com
dice algo mas?


2012/4/29 Juan Manuel Ollé <juanman...@gmail.com>

Alejandro Santos

unread,
Apr 30, 2012, 2:07:16 PM4/30/12
to cp...@googlegroups.com
muy interesante! lo busqué en el draft del estándar que hay en github
y solo dice lo que Juan Manuel copió:

(cuidado al hacer click, el firefox se pone medio lento)

https://github.com/cplusplus/draft/blob/master/source/templates.tex#L1657
Alejandro Santos

Juan Manuel Ollé

unread,
Apr 30, 2012, 2:10:47 PM4/30/12
to cp...@googlegroups.com
Sole,

--Veo dos cosas
--1. una función miembro templetizada no puede ser virtual.... esto no compila en VS.

Si dice que no tiene que ver con VS. Lo especifica el standard.

Lo que es interesante es la linea que sigue en el estandar

A specialization of a member function template does not override a virtual function from a base class.
[ Example:
class B {
virtual void f(int);
};
class D : public B {
template <class T> void f(T); // does not override B::f(int)
void f(int i) { f<>(i); } // overriding function that calls
// the template instantiation
};
—end example ]

Juan Manuel Ollé

unread,
Apr 30, 2012, 3:08:22 PM4/30/12
to cp...@googlegroups.com
Lo que no puede encontrar es que comportamiento tendria esto

struct A
{
      virtual voif f(int ){}
};

struct B : A
{
      template<class T> void f(T) {}
};

void g()
{
     B b;
     int x = 0;
     b.f( x );          // llama a la f de A o a la f de B
}

si ambas estuvieran en la misma clase claramente a la f(int) pero en este caso hace name hidding ?
Lo que esta claro es que la f templetizada mo overridea la la f de A (segun es standard)
Reply all
Reply to author
Forward
0 new messages