编译时类型检查c++

Compile time type checking C++

本文关键字:c++ 检查 类型 编译      更新时间:2023-10-16

我已经创建了一个类型列表。然后使用传递类型列表的模板创建一个类。当我调用类的print函数时,没有指定某些类型,它们将被强制转换。如何在编译时强制使用确切的类型?如果使用未列出的类型,就会出现编译错误。谢谢。

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实例,或者它是否创建了一个实例,我必须为每个类型创建一个打印函数?我觉得我几乎把所有的积木都记在脑子里了,但就是不能把它们拼在一起。你能提供的任何帮助我们都将感激不尽。谢谢。

添加私有函数模板

template<typename T> void print(T);

不需要实现。这将捕获所有不存在显式打印的类型,并且由于它是私有的,它将给出错误消息。

您必须将print函数放入模板中,然后检查类型是否匹配:

template <typename U>
void print(const U & u)
{
  // use std::is_same<typename std::decay<T::Head>::type, typename std::decay<U>::type>::value
}

这里我从<type_traits>窃取is_samedecay,但如果你没有c++ 11,你可以从TR1或Boost中获取它们,或者只是自己编写它们,因为它们是非常简单的类型修饰符类。

条件最好放在static_assert中,这是c++ 11的另一个特性,但是在c++ 98/03中存在类似的结构,在特定条件下会产生编译时错误。

您可以通过非const引用来接受参数,强制它们具有完全相同的类型。但是,您不能再将它用于const变量或文字