Anyone interested in the following boost "utility" library

How do you specify a string or a double, or an object as a template parameter? c++ templates are a compile time construct, so the answer is that you can't, or at least not directly. However, with the use of existing boost libraries and a little compiler magic, you can actually specify a string, double or any object as a template parameter. The following code is the proof of this concept. I would like to gather feedback from the group and submit this as a boost utility library if there is sufficient interest. //TODO //1) compile the following code as main.cpp. //2) run the application with three command line parameters. #include <vector> #include <string> #include <iostream> #include <boost/variant.hpp> std::vector<boost::variant<int, long,double,std::string> > resources; template <bool> struct resource{}; template <> struct resource<false> { template <typename INDEX, typename R> void operator()(INDEX index, R& out) { out = oost::get<R> (resources[index()]); } }; template <> struct resource<true> { template <typename T, typename R> void operator()(T in, R& out) { out = in; } }; template <typename T, typename R> inline void get(R& out) { resource<boost::is_convertible< T,R>::value> a; a(T(),out); } template <int T=-1> struct resource_wrapper { static const int value = T; int operator()(){return T;} }; template <int T=0> struct integer { static const int value = T; operator int(){return T;} }; typedef resource_wrapper<1> str1; typedef resource_wrapper<2> str2; typedef resource_wrapper<3> str3; typedef resource_wrapper<4> columns; template <typename STRING> struct funct { void operator()() { std::string str; get<STRING>(str); std::cout << str << std::endl; } }; template <typename DOUBLE> struct funct2 { void operator()() { double dbl; get<DOUBLE>(dbl); std::cout << dbl << std::endl; } }; int main(int argc, char* argv[]) { resources.resize(100); resources[str1::value] = std::string(argv[1]); resources[str2::value] = std::string(argv[2]); resources[str3::value] = std::string(argv[3]); resources[columns::value] = 6.33; funct<str1>()(); funct<str2>()(); funct<str3>()(); funct2<columns>()(); funct2<integer<10> >()(); return 0; } __________________________________________________ Do You Yahoo!? Tired of spam? Yahoo! Mail has the best spam protection around http://mail.yahoo.com
participants (1)
-
Tom Brinkman