Mam szablon temlate<class T, bool B> i chce, aby pewne funkcje istniały w szablonie jedynie jeśli B = true. Jak to zrobić ?
Istniały ?? To chyba niewykonalne, ale może w zależności od tego boola po prostu ich nie wywoływać...
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?
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 ?
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...
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>
Też mi się tak wydawało że w boost jest coś takiego, ale nie używałem, nie wiem, nie znam się...
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.