在编译时检查是模板类型还是向量 [英] Check at compile-time is a template type a vector

查看:70
本文介绍了在编译时检查是模板类型还是向量的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我可以想象以下代码:

template <typename T> class X
{
  public:
   T container;

   void foo()
   {
      if(is_vector(T))
         container.push_back(Z);
      else
         container.insert(Z);
   }
}

// somewhere else...

X<std::vector<sth>> abc;
abc.foo();

如何编写,才能成功编译?我知道类型特征,但是在定义时:

How to write it, to successfully compile? I know type traits, but when I'm defining:

template<typename T> struct is_vector : public std::false_type {};

template<typename T, typename A>
struct is_vector<std::vector<T, A>> : public std::true_type {};

无法编译:

error: no matching function for call to 'std::vector<sth>::insert(Z)'

static_assert也不是我要找的东西.有什么建议吗?

static_assert also isn't that what I'm looking for. Any advices?

这是我要实现的目标(SSC C E)的简短示例: http://ideone.com/D3vBph

Here's a short example of what I want to achieve (SSCCE): http://ideone.com/D3vBph

推荐答案

它被称为标签分派:

#include <vector>
#include <set>
#include <type_traits>

template<typename T> struct is_vector : public std::false_type {};

template<typename T, typename A>
struct is_vector<std::vector<T, A>> : public std::true_type {};

template <typename T>
class X {
    T container;

    void foo( std::true_type ) {
        container.push_back(0);
    }
    void foo( std::false_type ) {
        container.insert(0);
    }
public:
    void foo() {
        foo( is_vector<T>{} );
    }
};

// somewhere else...
int main() {
    X<std::vector<int>> abc;
    abc.foo();

    X<std::set<int>> def;
    def.foo();
}

这篇关于在编译时检查是模板类型还是向量的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆