C++ 模板元编程静态类型检查

标签 c++ templates template-specialization

我找不到问题的答案,所以我将其作为问题发布。我做了一个小的虚拟例子来解释它:

enum STORAGE_TYPE
{
    CONTIGUOUS,
    NON_CONTIGUOUS
};

template <typename T, STORAGE_TYPE type=CONTIGUOUS>
class Data
{
    public:
        void a() { return 1; }
};

// partial type specialization
template <typename T>
class Data<T, NON_CONTIGUOUS>
{
    public:
        void b() { return 0; }
};

// this method should accept any Data including specializations…
template <typename T, STORAGE_TYPE type>
void func(Data<T, type> &d)
{
    /* How could I determine statically the STORAGE_TYPE? */
    #if .. ?? 
        d.a();
    #else
        d.b();
    #endif      
}


int main()
{
    Data<int> d1;
    Data<int, NON_CONTIGUOUS> d2;

    func(d1);
    func(d2);

    return 0;
}

请注意 (1) 我不想要“func”的专门化,因为这可以解决它,但我只想拥有 1 个通用方法“func”,内部静态“if”条件来执行代码。 (2),我更喜欢使用标准 C++ 的解决方案(不是 C++0x 或 boost)。

最佳答案

使用traits technique :

template <typename T, STORAGE_TYPE type>
struct DataTraits {
  static void callFunction(Data<T, type> &d)
  {
    d.a();
  }
};

template <typename T>
struct DataTraits<T,NON_CONTIGUOUS> {
  static void callFunction(Data<T, NON_CONTIGUOUS> &d)
  {
    d.b();
  }
};


// this method should accept any Data including specializations…
template <typename T, STORAGE_TYPE type>
void func(Data<T, type> &d)
{
    /* How could I determine statically the STORAGE_TYPE? */
    DataTraits<T,type>::callFunction(d);
}

关于C++ 模板元编程静态类型检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12722493/

相关文章:

c++ - 如何为枚举编写只影响特定枚举类型的通用函数?

c++ - 为什么 SFINAE 需要 'Enable' 类模板参数?

c++ - 奇怪的! static const unsigned 不是类模板中的常量表达式?

c++ - 请递归帮助

c++ - "Builder"函数模板

c++ - 连接 IMPEG2DEMULTIPLEXER 和 ffdshow Directshow 过滤器

c++ - 具有可变高阶函数的重载分辨率

c++ - 使用模板特化和接口(interface)对实例和原始类型进行统一函数调用

c++ - 堆栈和队列在 Dev-C++ 中出现错误

c++ - 将 Ref 对象作为类成员