首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++模板元编程静态类型检查

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

Stack Overflow用户
提问于 2012-10-04 07:44:16
回答 2查看 2.1K关注 0票数 3

我找不到我的问题的答案,所以我把它作为一个问题张贴出来。我举了一个小例子来解释:

代码语言:javascript
复制
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) I不需要专门化的"func",因为这可以解决这个问题,但我只希望有一个具有内部静态"if“条件的泛型方法"func”来执行代码。(2)和我更喜欢使用标准C++ (而不是C++0x或boost)的解决方案。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-04 07:52:30

使用性状技术

代码语言:javascript
复制
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);
}
票数 5
EN

Stack Overflow用户

发布于 2012-10-04 07:51:45

关键是SFinae。您必须在存储类型上声明一个模板化的助手类,并为这两种类型之一提供一个定义。这样,如果在编译时存在专门化,您就知道您拥有哪种存储类型(您提供了一个定义),如果替换失败(这不是错误,SFINAE),则是另一种情况。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12722493

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档