Template
-
hm
ich will einer funktion einen
std::vector<double> oder std::list<double> usw. als template gebentemplate <class Seq> void fun(Seq& blah) { ... return (ValType) Res; // dieser ValType soll abhaengigsein vom Templateparameter // des Vektors oder der liste, sind sie double soll er double sein // sind sie float soll er float sein }
-
wie wärs mit Seq::value_type
-
Yo das waers
danke.
-
Bashar schrieb:
wie wärs mit Seq::value_type
b7f7 schrieb:
Yo das waers
danke.
Na wenn ich mich verarschen wollt, sagt doch bitte vorher bescheid. Dann spare ich mir das antworten.
-
Hume: Sorry, ich hab den Thread nicht gelesen, nur daraus, dass die Frage immer noch unbeantwortet war, geschlossen, dass die richtige Antwort noch nicht kam.
-
@Bashar
Kein Problem. Meine Antwort bezog sich a) mehr b7f7 und b) fehlte ihr auch ein Smiley zum Auflockern.
-
-
@HumeSikkins
ich wollt dich sicher nicht veralbern, aber ich must mir selbst erst klar darueber werden wie ich das am ende fuer mich passend hinbiege.
-
hm...
wie mach ich das nun bei
std::vector<std::vector<double> > ?
template <class Seq> Seq::value_type foo(const Seq &P) { return *(P.begin()); } std::vector<double> Vec=fill(); double d=foo(Vec); // so geht das aber template <class Seq> Seq::value_type::value_type foo(const Seq &P) { return *(P.begin()->begin()); } std::vector<std::vector<double> > Vec2=fill(); double d=foo(Vec2); // das kann er nicht herleiten // wie hangele ich mich dadurch? // Seq::value_type ist doch std::vector<double> ?
-
erstens stat deiner wirren verschachtelung von begin()s und dereferenzierungen solltest du einfach auf front() zurückgreifen.
zweitens fehlt da IMHO typenname.
-
Für Elementtypen die sich zb via Boost.TypeTraits filtern lassen ist folgendes möglich
#include <boost/mpl/identity.hpp> #include <boost/mpl/if.hpp> #include <boost/type_traits/is_fundamental.hpp> #include <boost/type_traits/is_same.hpp> #include <boost/static_assert.hpp> #include <vector> namespace mpl = boost::mpl; template <class Cont> struct element_type { typedef typename Cont::value_type type; }; template <typename T, template <typename> class Condition = boost::is_fundamental> struct get_value_type { typedef typename mpl::if_<Condition<T>, mpl::identity<T>, element_type<T> >::type sub_type; typedef typename mpl::if_c<Condition<typename sub_type::type>::value, typename sub_type::type, typename get_value_type<typename sub_type::type, Condition>::sub_type::type >::type type; }; int main() { typedef std::vector<std::vector<int> > vec; BOOST_STATIC_ASSERT((boost::is_same<get_value_type<vec>::type, int>::value)); }