编译时类型检查c++
Compile time type checking C++
我已经创建了一个类型列表。然后使用传递类型列表的模板创建一个类。当我调用类的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_same
和decay
,但如果你没有c++ 11,你可以从TR1或Boost中获取它们,或者只是自己编写它们,因为它们是非常简单的类型修饰符类。
条件最好放在static_assert
中,这是c++ 11的另一个特性,但是在c++ 98/03中存在类似的结构,在特定条件下会产生编译时错误。
您可以通过非const引用来接受参数,强制它们具有完全相同的类型。但是,您不能再将它用于const变量或文字
相关文章:
- valgrind-hellgrind与泄漏检查的结果不同
- C++模板来检查友元函数的存在
- 检查输入是否不是整数或数字
- 试图让变量检查数组中的某些内容
- 检查值是否在集合p1和p2中,但不在p3中
- C++概念:如何使用'concept'检查模板化结构的属性?
- 概念TS检查忽略私有访问修饰符
- 检查 std::shared_ptr<> 的当前底层类型是否为 T
- 在c++中检查长方体是否尽可能快地重叠(无迭代)
- 如何在C++中检查2D数组中负值的输入验证
- C++:正在检查LinkedList中的回文-递归方法-错误
- 使用for循环检查数组中的重复项
- 如何检查一个c++字符串中有多少相同的字符/数字
- 检查不带转换的扫描格式
- 如何检查线程是否锁定
- 清除前检查矢量
- 如何处理来自核心指南检查器的关于gsl::at的静态分析警告
- C++LDAP检查用户是否是特定组的成员
- 检查TCHAR数组输入是否为带符号整数C++
- 用概念检查属性的类型