C++ Type Traits

Custom Type Based on Type Traits

#include <stdint.h>
#include <string>
#include <iostream>

enum class SimpleType {
    ST_INVALID,
    ST_INT64,
    ST_UINT64,
    ST_DOUBLE,
    ST_STRING
};

template<SimpleType stype>
struct SimpleType2BuiltinType {
    struct InvalidType {};
    typedef InvalidType BuiltinType;
};

#define SimpleType2BuiltinTypeTraits(stype, btype)      template<>                                          struct SimpleType2BuiltinType<stype> {                  typedef btype BuiltinType;                      }

SimpleType2BuiltinTypeTraits(SimpleType::ST_INT64, int64_t);
SimpleType2BuiltinTypeTraits(SimpleType::ST_UINT64, uint64_t);
SimpleType2BuiltinTypeTraits(SimpleType::ST_DOUBLE, double);
SimpleType2BuiltinTypeTraits(SimpleType::ST_STRING, std::string);

#undef SimpleType2BuiltinTypeTraits

class Object {
public:
    Object(SimpleType stype)
        : type_(stype) {}
    ~Object() {}

public:
    virtual SimpleType type() const {
        return type_;
    }
    virtual void type(SimpleType stype) {
        type_ = stype;
    }

private:
    SimpleType type_;
};

template<class T>
class BasicType : public Object {
public:
    BasicType(SimpleType stype)
        : Object(stype) {}
    ~BasicType() {}

public:
    virtual void value(const T& value) {
        value_ = value;
    }
    virtual const T& value() const {
        return value_;
    }

private:
    T value_;
};

typedef BasicType<int64_t> Int64;
typedef BasicType<uint64_t> UInt64;
typedef BasicType<double> Double;
typedef BasicType<std::string> String;

#define SIMPLE_VALUE_HELPER(stype, obj)                                     case stype: {                                                               typedef SimpleType2BuiltinType<stype>::BuiltinType Type;                BasicType<Type>* typed = static_cast<BasicType<Type>*>(obj);            const Type& v = typed->value();                                         std::cout << v << std::endl;                                            break;                                                              }

#define SIMPLE_TYPE_MACRO_HEPLER(MY_MACRO, obj)     MY_MACRO(SimpleType::ST_INT64, obj)             MY_MACRO(SimpleType::ST_UINT64, obj)            MY_MACRO(SimpleType::ST_DOUBLE, obj)            MY_MACRO(SimpleType::ST_STRING, obj)

int main(int argc, char *argv[]) {
    std::string v("foo");
    String foo(SimpleType::ST_STRING);
    foo.value(v);
    Object* object = &foo;

    switch (object->type()) {
        SIMPLE_TYPE_MACRO_HEPLER(SIMPLE_VALUE_HELPER, object);
    default:
        break;
    }
    return 0;
}

原文地址:https://www.cnblogs.com/rain-blog/p/cpp-type-traits.html

时间: 2024-10-12 10:13:20

C++ Type Traits的相关文章

type traits

Type Traits,  类型萃取,这个概念涉及到的内容太多.基本常用的萃取方法可以参考 http://en.cppreference.com/w/cpp/types 这里主要记录一下对函数的萃取技巧. 1 template<typename R, typename ...Args> 2 R FuncWrapper(R(*func)(Args...), Args&&... args) 3 { 4 return func(std::forward<Args>(arg

格式工厂(七)Type Traits

版权声明:本文为博主原创文章,未经博主允许不得转载. 识别变量的type id,返回true或false,举一个简单使用的例子 template <typename T> void type_traits_output(const T& x) { cout << "\ntype traits for type : " << typeid(T).name() << endl; cout << "is_void\

视频笔记 CppCon 2015:Marshall Clow “Type Traits - what are they and why should I use them?&quot;

Video: CppCon 2015:Marshall Clow "Type Traits - what are they and why should I use them?" https://www.youtube.com/watch?v=VvbTP_k_Df4 如果你需要写关于不同类型的代码,而不是具体的类型,你可能需要了解Type Traits 4:47 C++多少种类型?14 void, nullptr: 只有一个成员在这个type里面 struct 实际上和class 是一

c++11 : static_assert和 type traits

static_assert提供一个编译时的断言检查.如果断言为真,什么也不会发生.如果断言为假,编译器会打印一个特殊的错误信息. 1 2 3 4 5 6 7 8 9 10 11 12 13 template <typename T, size_t Size> class Vector {    static_assert(Size < 3, "Size is too small");    T _points[Size]; }; int main() {    Vec

C++: C++ type traits technique

C++ Traits是什么? Think of a trait as a small object whose main purpose is to carry information used by another object or algorithm to determine "policy" or "implementation details". - Bjarne Stroustrup Trait 将类型的性质.特性封装起来,可用于判断类型的特性: 这个类

C++模板编程里的主版本模板类、全特化、偏特化(C++ Type Traits)

1.  主版本模板类 首先我们来看一段初学者都能看懂,应用了模板的程序: 1 #include <iostream> 2 using namespace std; 3 4 template<class T1, class T2> 5 class A{ 6 public: 7 void function(T1 value1, T2 value2){ 8 cout<<"value1 = "<<value1<<endl; 9 cou

C++模板 - value traits

前面的文章使用了type traits,其实traits还有value traits. 再看一下累加函数: template<typename T> struct traits; template<> struct traits<char> { typedef int AccuT; }; template<> struct traits<int> { typedef int AccuT; }; template<class T> ty

C++模板 - traits &amp; policy

traits和policy在泛型编程里面还是挺常见的.像stl的string实现里面就用到了traits,boost里面也很多地方用到traits. traits和policy很多时候都会一起使用,让我们在泛型编程里面多了一些思路. traits:中文解释为特征,记得候捷在<stl源码剖析>那本书里面还叫做萃取什么的.当我们想从一个类型身上获取他的一个附加特性的时候,往往可以考虑traits.比方说有一个类型T, 对他进行一些操作,然后要返回一个类型,那么可以理解为一个返回类型是跟T相关的.还

《Effective C++》:条款52-条款55

最后这三个条款属于杂项.条款53告诉我们不要忽略警告,虽然程序可以编译通过,但是要搞明白警告信息.条款54和条款55讲解C++的库,一个是TR1文档,一个是Boost.现在C++11标准已定,且有编译器支持.Boost库一些内容已经标准化到C++11,与其学习Boost,不如熟悉C++11中的Boost库内容. 条款53不要轻忽编译器的警告 条款54让自己熟悉包括TR1在内的标准程序库 条款55让自己熟悉Boost 条款53:不要轻忽编译器的警告 许多程序员习惯性的忽略编译器的警告.或许它们认为