Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Czy klasa ma metode?

0 views
Skip to first unread message

Piotr Wyderski

unread,
Jan 3, 2010, 1:50:28 PM1/3/10
to
Czy da siďż˝ w C++(0x) w czasie kompilacji sprawdziďż˝, czy
dana klasa C ma metodďż˝ (albo konstruktor) o sygnaturze S?
Wiem, jak da�oby si� to zrobi� za pomoc� koncept�w, ale
wylecia�y...

Pozdrawiam
Piotr Wyderski

Bronek Kozicki

unread,
Jan 3, 2010, 3:35:50 PM1/3/10
to
On 03/01/2010 18:50, Piotr Wyderski wrote:
> Czy da siďż˝ w C++(0x) w czasie kompilacji sprawdziďż˝, czy
> dana klasa C ma metodďż˝ (albo konstruktor) o sygnaturze S?

w _ograniczonym_ zakresie da siďż˝ :

#include <cstdio>

class A
{
public:
void testme(int) {}
};

class B
{
public:
void testme(int) {}
};

class C : public B
{
};

class D
{
};

class E
{
void testme(int) {}
};

template <typename Type>
class test_testme
{
typedef char Y;
struct N {char dummy[2];};

// Typ funkcji tutaj ...
template <void (Type::*t)(int)>
struct holder_Y {typedef Y type;};

// ... nazwa tutaj
template <typename U>
static typename holder_Y<&U::testme>::type test(U*);

template<typename U>
static N test(...);

public:
enum {result = sizeof(test<Type>((Type*) NULL)) == sizeof(Y)};
};


int main()
{
std::puts(test_testme<A>::result ? "test_testme<A>" : "");
std::puts(test_testme<B>::result ? "test_testme<B>" : "");
std::puts(test_testme<C>::result ? "test_testme<C>" : "");
std::puts(test_testme<D>::result ? "test_testme<D>" : "");
// std::puts(test_testme<E>::result ? "test_testme<E>" : "");
}

Piotr Wyderski

unread,
Jan 3, 2010, 4:21:52 PM1/3/10
to
Bronek Kozicki wrote:

> w _ograniczonym_ zakresie da siďż˝ :

[ciach] -- po prostu genialne, dzi�ki wielkie!

Pozdrawiam
Piotr Wyderski

Piotr Wyderski

unread,
Jan 4, 2010, 4:06:28 AM1/4/10
to
Bronek Kozicki wrote:

A w�a�ciwie na jakiej zasadzie to dzia�a? :-D
SFINAE na:

static typename holder_Y<&U::testme>::type test(U*);

i specjalizacja wylatuje z listy?

Pozdrawiam
Piotr Wyderski

Bronek Kozicki

unread,
Jan 4, 2010, 3:39:19 PM1/4/10
to
On 04/01/2010 09:06, Piotr Wyderski wrote:
> SFINAE na:
> static typename holder_Y<&U::testme>::type test(U*);
> i specjalizacja wylatuje z listy?

dok�adnie. To nie jest m�j pomys� :D


B.

0 new messages