gpt4 book ai didi

c++ - C++ 中的空尖括号

转载 作者:行者123 更新时间:2023-12-01 11:10:58 26 4
gpt4 key购买 nike

在探索 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.....
}

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

最佳答案

你缺少的是

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

在此 live example

关于c++ - C++ 中的空尖括号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60625793/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com