【问题标题】:Passing a general argument to function using template使用模板将一般参数传递给函数
【发布时间】:2016-04-27 09:23:03
【问题描述】:

有一些类,它们的关系如下:

class X:A,B
class Y:A,B
class Z:A,B

我想使用模板将从 A 和 B 继承的通用类型传递给 testFunction。我的代码如下:

template<template T:public A, public B>
void testFunction(T generalType)
{
    //do something
}

但我的编译器告诉我这是错误模板。我该如何解决?

【问题讨论】:

  • 重新打开了这个 - 假设的副本是关于一个 class。但与类不同,函数具有重载。这意味着您希望从重载集中排除特定函数,而不是让它们在重载决议中被选中,然后在稍后中断。
  • 为什么不直接写template&lt;template T&gt; 看看是否可行。我不知道你的应用程序是如何工作的,但它可能没问题。你还有其他函数叫testFunction吗?
  • @MSalters @Aaron McDaid @songyuanyao。感谢您的所有耐心和仔细的回答。在您的帮助下,我的代码通过了编译阶段。我从你们所有人那里学到了很多,

标签: c++ templates


【解决方案1】:

有条件地定义模板的标准方法是std::enable_if&lt;condition&gt;。在这种情况下,您要检查条件std::is_base_of&lt;A,T&gt;::value &amp;&amp; std::is_base_of&lt;B,T&gt;::value

【讨论】:

    【解决方案2】:

    template&lt;template T:public A, public B&gt; 不是有效的语法。您可以使用std::is_base_ofstatic_assert 检查类型,如果传递了错误的类型,则会触发编译器错误。

    template <typename T>
    void testFunction(T generalType)
    {
        static_assert(std::is_base_of<A, T>::value && std::is_base_of<B, T>::value, "T must inherit from A and B.");
    }
    

    DEMO

    【讨论】:

      猜你喜欢
      • 2011-08-26
      • 2020-12-17
      • 1970-01-01
      • 2016-05-17
      • 1970-01-01
      • 1970-01-01
      • 2019-01-16
      • 2011-11-15
      • 1970-01-01
      相关资源
      最近更新 更多