0

我怎样才能在 C++ 中做到这一点?缺乏static_if将使事情变得更加困难。

template<typename T>
struct foo {
  foo() {
    //construction

    //if (T is an instantiation of some other template, say std::vector)
    //{
    //   stuff 1
    //}
  }

  void some_func() {
    //some code

    //if (T is an instantiation of some other template, say std::vector)
    //{
    //   stuff 2
    //}
  }
};

如果有任何帮助,这里的代码告诉我们是否T是另一个模板:

做一个静态断言模板类型是另一个模板

唯一的问题是如何将其转换为“如果”条件。

4

2 回答 2

2

使用调度助手函数:

template<typename T>
struct foo {
public:
  foo() {
    //construction

    stuff1(static_cast<T*>(nullptr));
  }

  void some_func() {
    //some code

    stuff2(static_cast<T*>(nullptr));    
  }

private:
  template<typename U> void stuff1(U*) {}
  template<typename E, typename A> void stuff1(std::vector<E,A>*)
  { /* stuff 1 */ }

  template<typename U> void stuff2(U*) {}
  template<typename E, typename A> void stuff2(std::vector<E,A>*)
  { /* stuff 2 */ }
};
于 2013-07-06T14:53:17.530 回答
0

您指向的链接已经有一个条件代码,可以告诉您正确的答案。你所要做的就是把它放在一个“如果”中。

不需要“static_if”。如果您的代码可以在编译时确定是否采用 if,则优化未采用的路径以及实际的 if 语句。由于为每种类型单独实例化(读取 - 编译)模板函数,并且由于可以静态检测每个实例化的 if 条件,因此只需使用标准 if。

沙查尔

于 2013-07-06T14:52:23.430 回答