4

在探索 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<>.片段。observable除了void,void. _

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

我在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.....
}

然而,即使只有一个明确的特化,它也不会编译。

4

1 回答 1

5

你缺少的是

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<>将使用这些默认值的模板。在您的示例中,这将通过添加来完成

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

在这个活生生的例子中

于 2020-03-10T21:20:10.113 回答