C++ 中的空尖括号
Empty angle brackets in C++
在探索 RxCpp 库时,我遇到了以下我无法解释的示例。
auto ints = rxcpp::observable<>::create(
[](rxcpp::subscriber<int> s){
s.on_next(1);
s.on_next(2);
s.on_completed();
});
库中有两个observable
class的声明:
template<class T, class SourceOperator>
class observable
: public observable_base<T>
{
// ...
};
template<>
class observable<void, void>
{
// ...
};
我无法理解的是编译器如何设法接受 rxcpp::observable<>.
片段。除了 void,void
.
之外,observable
可能有许多针对不同类型的显式特化
问题是编译器如何解释这段代码中的空尖括号:rxcpp::observable<>.
我在 observable
class 中没有看到默认模板参数,也没有可以解释这一点的可变模板参数。
然后我认为它与显式模板特化有某种关系,并尝试在一个孤立的程序中重现它,例如像这样
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;
的第 142-146 行
此前向声明为 observable
class 提供默认模板参数,并允许您编写将使用这些默认值的 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
在这个live example
在探索 RxCpp 库时,我遇到了以下我无法解释的示例。
auto ints = rxcpp::observable<>::create(
[](rxcpp::subscriber<int> s){
s.on_next(1);
s.on_next(2);
s.on_completed();
});
库中有两个observable
class的声明:
template<class T, class SourceOperator>
class observable
: public observable_base<T>
{
// ...
};
template<>
class observable<void, void>
{
// ...
};
我无法理解的是编译器如何设法接受 rxcpp::observable<>.
片段。除了 void,void
.
observable
可能有许多针对不同类型的显式特化
问题是编译器如何解释这段代码中的空尖括号:rxcpp::observable<>.
我在 observable
class 中没有看到默认模板参数,也没有可以解释这一点的可变模板参数。
然后我认为它与显式模板特化有某种关系,并尝试在一个孤立的程序中重现它,例如像这样
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;
的第 142-146 行
此前向声明为 observable
class 提供默认模板参数,并允许您编写将使用这些默认值的 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
在这个live example