【发布时间】:2011-11-12 18:25:54
【问题描述】:
我创建了一个类型列表。然后我使用传递类型列表的模板创建一个类。当我使用未指定的某些类型调用类的打印函数时,它们被强制转换。如何在编译时强制执行确切的类型?因此,如果我使用未列出的类型,则会出现编译器错误。 谢谢。
template <class T, class U>
struct Typelist
{
typedef T Head;
typedef U Tail;
};
class NullType
{
};
typedef Typelist<int,Typelist<float,Typelist<char*,NullType> > > UsableTypes;
template<class T>
class MyClass
{
public:
void print(T::Head _Value) { std::cout << _Value; }
void print(T::Tail::Head _Value) { std::cout << _Value; }
void print(T::Tail::Tail::Head _Value) { std::cout << _Value; }
private:
};
MyClass<UsableTypes> testclass;
void TestMyClass()
{
int int_val = 100000;
float flt_val = 0.1f;
char* char_val = "Hi";
short short_val = 10;
std::string str_val = "Hello";
testclass.print( int_val ); // OK 8-)
std::cout << endl;
testclass.print( flt_val ); // OK 8-)
std::cout << endl;
testclass.print( char_val ); // OK 8-)
std::cout << endl;
testclass.print( short_val); // this compiles OK and works ??? 8-(
std::cout << endl;
testclass.print( str_val ); // compile error 8-)
std::cout << endl;
}
@Kerrek SB:您好,我认为它会帮助我完成下一步,即根据 t_list 内容、类型和类型数量创建打印函数。但我正在努力将编译时处理和运行时处理分开。我要做的是为列表中的每种类型创建一个打印功能。因此,如果列表有两种类型,则将创建两个打印函数,如果有五种类型,则将为每种类型创建五个打印函数。 当我这样做时:
typedef Typelist<int,Typelist<float,Typelist<char*,NullType> > > UsableTypes;
MyClass<UsableTypes> newclass
这会为列表中的每种类型创建三个 MyClass 实例,还是创建一个实例并且我必须为每种类型创建一个打印函数? 我觉得我几乎把所有的块都放在了我的脑海里,但就是无法将它们组合在一起。您能提供的任何帮助将不胜感激。谢谢。
【问题讨论】:
-
你的
print函数并不是很有用,因为它没有实现任何递归。