【问题标题】:Compile time type checking C++编译时类型检查 C++
【发布时间】: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 函数并不是很有用,因为它没有实现任何递归。

标签: c++ templates casting


【解决方案1】:

添加私有函数模板

template<typename T> void print(T);

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

【讨论】:

  • 感谢您解决了我的问题。指出时似乎很明显:)
【解决方案2】:

你必须将你的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
}

这里我从&lt;type_traits&gt; 窃取is_samedecay,但是如果你没有C++11,你可以从TR1 或Boost 中获取它们,或者自己编写它们,如它们是非常简单的类型修饰符类。

条件最好进入static_assert,这是另一个 C++11 功能,但 C++98/03 存在类似的构造,在特定条件下会产生编译时错误。

【讨论】:

  • @sehe: 确实是我之前遇到过的 :-)
  • 感谢这帮助我解决了下一个问题,使其为不同大小的类型列表创建打印功能。
【解决方案3】:

你可以通过非常量引用来获取你的参数,强制它们是完全相同的类型。但是,您不能再将它与 const 变量或文字一起使用。

【讨论】:

  • 谢谢 我现在开始从不同的角度看待这些问题。
猜你喜欢
  • 1970-01-01
  • 2011-02-06
  • 2014-03-31
  • 2020-02-07
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 2015-07-31
相关资源
最近更新 更多