模板类

时间:2015-12-08 23:32:16

标签: c++ templates c++11

我想向一个模板类添加一个静态函数,该模板类可以在不先传递模板参数的情况下访问。这可能吗?

namespace foo {
  template <typename T>
  class bar {
  public:
    static void eggs();
  };
}

foo::bar<some_t>::eggs();  // works
foo::bar::eggs();  // does not work

我希望避免将eggs()移动到foo命名空间或为其创建新的命名空间(例如。foo::bar_::eggs(),ugh)。

4 个答案:

答案 0 :(得分:4)

没有。这不是模板类的工作方式。你不想在C ++中做什么。

答案 1 :(得分:1)

请记住,foo::bar并未命名任何类型,而只是一个可用于创建其他类型的模板。

除了使用typedef / type别名(通过using)之外,您可以为模板创建一个非模板化的基类,然后将静态成员放在那里。如果使用公共继承,则更改任何模板化类中的静态成员将在所有模板中更改。

答案 2 :(得分:1)

在尝试使用您的代码后:

  

我想将静态函数添加到可访问的模板类中   没有先传递模板参数。这可能吗?

namespace foo {
  template <typename T>
  class bar {
  public:
    static void eggs();
  };
}

foo::bar<some_t>::eggs();  // works
foo::bar::eggs();  // does not work
  

我想避免将eggs()移动到foo命名空间或创建   它的新命名空间(例如.foo :: bar _ :: eggs(),ugh)。

我得出结论,

的第一个例子
foo::bar<some_t>::eggs(); // works while
foo::bar::eggs(); // doesn't 

由于使用模板时,类中的任何内容都必须与特定对象相关,即使您不希望使用该函数。我甚至尝试使用函数指针并尝试将它们保存到模板类中而且没有用,我甚至无法编译。在这种情况下,我没有看到很多选项。也许有人可能知道的其他技巧,但不是我能看到的。

答案 3 :(得分:0)

您可以使模板参数可选,您可以定义专用模板。像这样:

namespace foo {

template <typename T = void> class bar {
public:
  static void eggs() { cout << "First there was the egg" << endl; }
};

template <> class bar<void> {
public:
  static void eggs() {
    cout << "Then there was the chicken... or was it?" << endl;
  }
};
}

auto main() -> int {
  foo::bar<int>::eggs(); // egg
  foo::bar<>::eggs();    // chicken

  return 0;
}