 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Filip Konvicka Guest
|
Posted: Mon May 21, 2007 9:10 am Post subject: local type as template argument |
|
|
Hi all,
I wonder whether anyone has seen a workaround for this somewhere,
perhaps in Boost or elsewhere...
I succeeded using a local type as template argument in MSVC 8.0, but I
found out that this violates the standard (14.3.1.2), and sadly does not
work with g++ (3.4.3, did not try newer). I was essentialy able to run
some code for each local type before main() - see the source code below.
I know that to make it work, one could simply make the class non-local,
but I'd like to keep the classes local and achieve some pre-main
initialization for them. I know that the standard is clear about this,
but maybe there is some trick...? The reason for all this is my desire
to see all locally-defined strings (so I can do localization etc.)
Thanks for suggestions,
Filip
#include <iostream>
#include <list>
using namespace std;
// common interface
struct XC {
virtual const char* get_data() = 0;
virtual ~XC() {}
};
typedef list<XC*> XCL;
XCL global_list;
template<typename Y>
struct X : public XC {
X() {
// make this instance globally accessible...
// this runs before main() for each X
// instantiation
global_list.push_back(this);
}
virtual const char* get_data() {
return get_data_static();
}
static X initializer;
// return data associated with Y
static const char* get_data_static() {
return data;
}
// data associated with Y
static const char* data;
};
template<typename Y>
const char* X<Y>::data=Y::getYData();
template<typename Y> X<Y> X<Y>::initializer;
int main(int argc,char* argv[]) {
// the local type whose data
// will be visible globally
struct Y {
static const char* getYData() {
return "some data";
// make sure X<Y>::initializer exists
X<Y>::initializer;
}
};
// walk the list of X specializations:
XCL::iterator i, e=global_list.end();
for(i=global_list.begin(); i!=e; ++i)
cout << (*i)->get_data() << endl;
// use X<Y> directly:
cout << X<Y>::get_data_static() << endl;
return 0;
} |
|
| Back to top |
|
 |
Guest
|
Posted: Tue May 22, 2007 9:11 am Post subject: Re: local type as template argument |
|
|
| Quote: | I succeeded using a local type as template argument in MSVC 8.0, but I
found out that this violates the standard (14.3.1.2), and sadly does not
work with g++ (3.4.3, did not try newer). I was essentialy able to run
some code for each local type before main() - see the source code below.
I know that to make it work, one could simply make the class non-local,
but I'd like to keep the classes local and achieve some pre-main
initialization for them. I know that the standard is clear about this,
but maybe there is some trick...? The reason for all this is my desire
to see all locally-defined strings (so I can do localization etc.)
As you said the standard is quite clear on the matter (will hopefully
change in the next standard) so the only trick that I can come up with
is to search the gcc documentation that enables some non-standard
behaviour (just like MSVC8).
|
Thanks for your reply. gcc does not seem to have such feature (I
checked v.4.1.2).
Nevermind, I just wanted to make sure that I did not overlook
something obvious. I'll stick to non-local types then, and wait
eagerly for the next standard (I read some proposals about this, but
it seems to me that it will take years to get into the standard, if
ever).
Cheers,
Filip |
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|