funkcja w zależności od argumentu szablonu

0

Mam szablon temlate<class T, bool B> i chce, aby pewne funkcje istniały w szablonie jedynie jeśli B = true. Jak to zrobić ?

0

Istniały ?? To chyba niewykonalne, ale może w zależności od tego boola po prostu ich nie wywoływać...

0
adf88 napisał(a)

Mam szablon temlate<class T, bool B> i chce, aby pewne funkcje istniały w szablonie jedynie jeśli B = true. Jak to zrobić ?

A co chcesz osiągnąć konkretnie?
Czego ten szablon jest? Klasy?

0

Jest to szablon klasy elementów pewnej listy. I teraz ta lista może być multiselect lub nie i w zależności od tego w szablonie będą różne niektóre funkcje. Wydaje mi sie, że można to osiągnąć bez specjalnych rozszerzeń dla kompilatora, tylko nie wiem jak.
A co kompilator zrobi kompilując szablon, gdy napotka np. coś takiego
if(false) { instrukcja1; instrukcj2; ... }
Czy kompilator zignoruje ten fragment ?

0

tak może działać tylko preprocesor:
#if xx /ifdef / ifndef, itp.
kod;
kod;
#endif

Natomiast można wykorzystać template'y jeśli wiesz na co się piszesz, tzn. jeżeli na pewno jest ci potrzebne takie deklarowanie klasy przez parametr wzorca, a nie przez np. #define; będzie to wymagać trochę pisania, ciężko to będzie kontrolować...

#include <iostream>
using namespace std;

struct my_true;
struct my_false;
    
template<typename T,typename B>
class Klasa
{
};

template<typename T>
class Klasa<T,my_true>
{
    T t;
public:
    Klasa() {cout<<"true"<<endl;}
    void truefoo() {};
};

template<typename T>
class Klasa<T,my_false>
{
    T t;
public:
    Klasa() {cout<<"false"<<endl;}
    void falsefoo() {};    
};

int main()
{
    Klasa<int,my_true> kt;
    kt.truefoo();
    
    Klasa<int,my_false> kf;
    kf.falsefoo();
}

Jeśli ktoś zna jakiś inny sposób to niech przedstawi, tylko sensownie...

0

Dzięki marcinEc [browar] , tyle mi wystarczy.

Znalazłem jeszcze coś takiego jak enable_if w biblitekach boost, ale jakoś nie moge tego ogarnąć :/</url>

0

Też mi się tak wydawało że w boost jest coś takiego, ale nie używałem, nie wiem, nie znam się...

0

UWAGA! C++ hardcore

Jednak wszystko się da zrobić.

To tak: enable_if nie nadaje się do tego...

Ale może takie coś:

#include <iostream>
#include <boost/static_assert.hpp>
using namespace std;
using namespace boost;

template<typename T,bool b>
class Klasa
{
    T t;

public:
    Klasa() {cout<< b <<endl;}

    void foo() 
    {
        cout << __func__ << endl;
    }
    
    void truefoo()
    {
        BOOST_STATIC_ASSERT(b==true);
        cout << __func__ << endl;
    }
    
    void falsefoo()
    {
        BOOST_STATIC_ASSERT(b==false);
        cout << __func__ << endl;
    }
    
    // only for true
    void kungfoo()
    {
        BOOST_STATIC_ASSERT(b);
        
        cout << __func__ << endl;
    }
};

int main()
{
    Klasa<int,true> kt;
    kt.foo();
    kt.kungfoo();
    kt.truefoo();
    //kt.falsefoo(); //error
    
    Klasa<int,false> kf;
    kf.foo();
    kf.falsefoo();
    //kf.truefoo(); // error
    //kf.kungfoo(); // error
}

Wykorzystano BOOST_STATIC_ASSERT().
Można określić, ktore metody mogą być użyte i to podczas kompilacji. Łatwo kontrolować teraz taki kod.

1 użytkowników online, w tym zalogowanych: 0, gości: 1