1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2025-12-26 07:11:34 -08:00
emacs/test/cedet/tests/templates.cpp
2009-10-02 10:53:34 +00:00

130 lines
2.7 KiB
C++

// C++ examples and requests from Klaus Berndl
// template in a unnamed namespace
namespace
{
template<typename Target, typename Source>
Target lexical_cast(Source arg)
{
std::stringstream interpreter;
Target result;
if(!(interpreter << arg) || !(interpreter >> result) ||
!(interpreter >> std::ws).eof())
throw bad_lexical_cast();
return result;
}
}
template <class T, FOO> class Vector
{
private:
static T* v;
int sz;
public:
T& elem(int i) {return v[i];}
virtual ~Vector ();
protected:
Vector ();
};
template <> class Vector <void*>
{
private:
void** v;
int sz;
public:
Vector ();
virtual int func1(int i);
virtual int func2(int i) = 0;
static virtual int func3(int i) = 0;
void*& elem(int i) {return v[i];}
//...
};
// template contains namespace
typedef vector<CzkUtilities::Action*> ActionList;
// declaration of some template-types
map<XXX, Test::YYY>** map_var;
map_with_size<XXX, Test::YYY, size> map_size_var;
typedef map_with_size<XXX, Test::YYY, size> SizedMap;
map_with_10_size<XXX, Test::YYY, 10>* pMap_size10_var;
typedef map_with_10_size<XXX, Test::YYY, 10> Size10Map;
// a function which such a template-argument
void* test_function(map<ClassX, Test::ClassY, 10>* pMap);
template <class T> class Vector <T*> : private Vector <void*>
{
public:
typedef Vector <void*> Base;
Vector () : Base() {}
T*& elem(int i) {return static_cast<T*&>(Base::elem(i));}
//...
};
// outside method implementation of a template-class
template<class T> T& Vector<T*>::elem(int i)
{
return C;
}
// same but qualified with a namespace Testnamespace
template<class T> T& Testnamespace::Vector<T*>::elem(int i)
{
return C;
}
// function templates with keyword typename
template<typename Target, typename Source>
Target lexical_cast(Source arg)
{
std::stringstream interpreter;
Target result;
if(!(interpreter << arg) || !(interpreter >> result) ||
!(interpreter >> std::ws).eof())
throw bad_lexical_cast();
return result;
}
template<class T>
static
typename T::_ptr_type
getService(const std::string& pServiceName, const int pRetries=20)
{
return T::_narrow(getServiceObject(pServiceName, pRetries));
}
// function template declaration
template<class T> void sort(vector<T>&);
// complex function template definition
template<class T, class S, const NamespaceY::ClassX<TestClass, &s> volatile ***&i>
map<ClassY, ClassX, 10>
sort(const vector<T>& v)
{
return;
}
// variable declarations of template-types
foo<TClass, Testnamespace::XClass, i> *bar1;
foo<TClass, Testnamespace::XClass, **&i> *bar2;
foo<TClass, Testnamespace::XClass, *Namespace::ClassX::i> bar3;
foo<0> bar0;
class SomeName;
class OtherName;
// arch-tag: 55ff74de-74dc-44ad-8252-50dc5f3492c3