【问题标题】:How to use generic type in function with constraint (C++) [duplicate]如何在具有约束的函数中使用泛型类型(C++)[重复]
【发布时间】:2019-09-29 19:03:47
【问题描述】:

我有一个算法,需要使用名为“Stack”(即“LinkedStack”、“ArrayStack”等)的父类的许多实现来执行。 我想如果我把这个算法写成一个函数并提供某种通用类型/模板函数魔法,问题就会解决。

但我没有找到任何方法。

我已经搜索并尝试了许多语法,但也许不可能?

template<class T: Stack> // Imaginary synthax to tell "T is a Stack"
void doTaskWithSpecificImplementation() 
{
    // Eventually somewhere in the function:
    T stack = new T();
}

void main() {
    doTaskWithSpecificImplementation<LinkedStack>();
}

我希望这段代码能够提供一种调用函数的简便方法,同时规定使用特定的虚拟类实现。

【问题讨论】:

  • 我会推断您来自 java 或类似的地方,您可以在泛型类型上使用 extends。通常 C++ 使用更多的编译时鸭子类型方法(尽管这会随着概念的变化而变化)。
  • @MaxVollmer 确实如此。谢谢!

标签: c++


【解决方案1】:

你的问题没有提到重载,只是在你得到错误类型时给出一个可以理解的错误。在这种情况下,static_assertstd::is_base_of

template<typename T>
void doTaskWithSpecificImplementation() {
    static_assert(std::is_base_of<Stack, T>{}, "T must be a Stack or a Stack subclass");
}

【讨论】:

  • sfinae 将是一个更好的解决方案:如果在路上我们想要一个不同的 impl,如果它不是一个堆栈呢?
  • static_assert 是权宜之计,SFINAE 会产生冗长且有些不透明的编译时错误消息。如果是共享代码库,SFINAE 可能是更好的选择。如果它完全是特定项目内部的,那就是一个判断电话。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多