在C++中实现类型演算---(ajoo, hyifeng请进)
程序其实前天就写出了,但其中对参加演算的类型有一个size不能相同的限制,我想了很久也没有想出解决的办法,因为无法将一个对象token在编译时引入模版类中,但好在ajoo没有说不可以对类型作限制,所以虽然还不是太完美,但马马虎虎也可以交差了:-),所以是被该给我200大元了,呵呵,另外也一起想想可不可以作的更通用一些。下面的程序在VC7.0上作了简单的测试(也可能不够完全)。两位不妨试试。
//EnvaType.h
#pragma once
#include "..\loki\TypeList.h"
using namespace Loki;
using namespace Loki::TL;
namespace EnvaType
{
template <class TL, int Size>
class EnvaType
{
public:
template <int Index>
struct IndexOfEnvaType
{
typedef typename TypeAt<TL,Index>::Result Type;
enum { value = sizeof(Type) == Size ? Index : IndexOfEnvaType<Index-1>::value };
};
template <>
struct IndexOfEnvaType<-1>
{
enum { value = -1 };
};
private:
enum { length = Length<TL>::value };
enum { index = IndexOfEnvaType<length-1>::value };
public:
typedef typename TypeAt<TL,index>::Result Result;
};
template <typename T>
void IsConvertible(const T& obj){return ;};
#define TYPE_FROM_INFER(TL, newObj, obj) ::EnvaType::EnvaType<TL,sizeof(obj)>::Result
#define TO_INFER(TL, newObj, obj) TYPE_FROM_INFER(TL, newObj, obj) newObj
#define INFER(TL, newObj, obj) TO_INFER(TL, newObj, obj);\
IsConvertible<TYPE_FROM_INFER(TL, newObj, obj)>(obj);\
};
//end of file EnvaType.h
//MyTest.h
#pragma once
#include <iostream>
using namespace std;
namespace MyTest
{
struct CTestA
{
char _val[1];
void whoami(void)
{
cout << "I am A" << endl;
}
};
struct CTestB
{
char _val[2];
void whoami(void)
{
cout << "I am B" << endl;
}
};
struct CTestC
{
char _val[40];
void whoami(void)
{
cout << "I am C" << endl;
}
};
CTestA MakeO(float n)
{
return CTestA();
}
CTestB MakeO(double n)
{
return CTestB();
}
CTestC MakeO(char n)
{
return CTestC();
}
using namespace EnvaType;
#define TL_TEST TYPELIST_3(CTestA, CTestB, CTestC)
#define MyINFER(name, obj) INFER(TL_TEST, name, obj)
};
//end of file MyTest.h
//main.h
......
cout << "EnvaType testing start ..." << endl;
CTestB a;
MyINFER(newa, a);
newa.whoami();
MyINFER(newo, MakeO((float)0));
newo.whoami();
......
//end of test