C++中的空尖括号

  • 本文关键字:C++ c++ rxcpp
  • 更新时间 :
  • 英文 :


在探索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<>.片段的。除了void,void之外,对于不同类型的observable可能有许多明确的专门化。

问题是编译器如何解释此代码中的空尖括号: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.....
}

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

您缺少的是

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

来自rx-预定义的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

在这个实例中

相关内容

  • 没有找到相关文章