【问题标题】:Empty angle brackets in C++C ++中的空尖括号
【发布时间】:2020-03-10 20:54:36
【问题描述】:

在探索 RxCpp 库时,我遇到了以下我无法解释的示例。

    auto ints = rxcpp::observable<>::create(
        [](rxcpp::subscriber<int> s){
            s.on_next(1);
            s.on_next(2);
            s.on_completed();
    });

库中有两个observable类的声明:

template<class T, class SourceOperator>
class observable
    : public observable_base<T>
{
// ...
};

template<>
class observable<void, void>
{
// ...
};

我无法理解的是编译器如何设法接受rxcpp::observable&lt;&gt;. 片段。除了void,void之外,对于不同的类型,observable 可能有很多明确的特化。

问题是编译器如何解释这段代码中的空尖括号:rxcpp::observable&lt;&gt;.

我在observable 类中没有看到默认模板参数,也没有可以解释这一点的可变参数模板参数。

然后我认为它与显式模板专业化有某种关系,并试图在一个孤立的程序中重现它,例如这样

namespace isolated {
  template<class T>
  class Test {
  public:
    static void say() {
      cout << "I am generic" << endl;
    }
  };

  template<>
  class Test<int> {
  public:
    static void say() {
      cout << "I am integer" << endl;
    }
  };
}

int main() {
  isolated::Test<>::say(); // ERROR: too few arguments for class template.....
}

但是,即使只有一个显式特化,它也无法编译。

【问题讨论】:

  • 看起来您缺少一些东西。 rxcpp::observable&lt;&gt; 可以工作的唯一方法是是否有默认模板参数。看源码看看有没有observable这样的前向声明template&lt;class T = something, class SourceOperator = something_else&gt; class observable
  • @JerryJeremiah 他说的是调用站点 (sn-p 1),而不是 sn-p 2 的专业化。
  • 查找类模板的声明。它可以有默认的模板参数。例如。 template&lt;class T = void, class SourceOperator = void&gt; class observable;

标签: c++ rxcpp


【解决方案1】:

你缺少的是

template<
     class T = void,
     class SourceObservable = typename std::conditional<std::is_same<T, void>::value,
         void, dynamic_observable<T>>::type>
 class observable;

来自rx-predef.hpp的第142-146行

此前向声明为observable 类提供默认模板参数,并允许您编写observable&lt;&gt;,它将使用这些默认值。在您的示例中,这将通过添加来完成

template<class T = int>
class Test;

这给了你

namespace isolated {
  template<class T = int>
  class Test;

  template<class T>
  class Test {
  public:
    static void say() {
      cout << "I am generic" << endl;
    }
  };

  template<>
  class Test<int> {
  public:
    static void say() {
      cout << "I am integer" << endl;
    }
  };
}

int main() {
  isolated::Test<>::say(); // ERROR: too few arguments for class template.....
}

和输出

I am integer

在这个live example

【讨论】:

  • 我想知道为什么有人想将带有模板参数默认值的前向声明放在单独的标题中,而库用户不应该直接包含该标题。
  • @Mooh 头文件之间似乎有相当多的依赖关系。很可能这是他们在设计中“必须使用”的地方,以便让默认设置正确地应用到任何地方。
猜你喜欢
  • 1970-01-01
  • 2013-02-28
  • 1970-01-01
  • 2014-09-15
  • 1970-01-01
  • 1970-01-01
  • 2021-09-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多