我读了这个问题并认为它很有趣,所以我开始玩一些代码来看看我是否可以让它工作,但我遇到了一个问题.
我的方法是使用熟悉函数式编程的头尾习语.但是,我找不到处理空的可变参数模板列表的方法,这将是基本情况.
这是我的代码:
#include#include class A {}; class B : public A {}; class C {}; class D : public C {}; /* // Forward declaration template struct are_convertible; */ // There are no Args template <> struct are_convertible<> { static const bool value = true; }; // Check if the first two elements are convertible then recurse on the rest template struct are_convertible { static const bool value = std::is_convertible ::value && are_convertible ::value; }; int main() { std::cout << std::boolalpha; std::cout << "Are convertible A->B and C->D: " << are_convertible::value << std::endl; // Should be false }
我目前收到一个错误'are_convertible' is not a class template
,所以我试图转发声明它,这给出了这个错误:
错误:模板参数数量错误(0,应至少为2)
我该如何修复我的方法?
你有两个问题.
首先,使用您的前向声明,您说您的模板始终接受至少两个参数(T1
和T2
).如果要为结构不允许任何参数,则需要仅使用variadic参数对其进行前向声明:
templatestruct are_convertible;
其次,您的第二个定义不是部分特化,而是与先前的前向声明相矛盾的完整的一般(新的)模板定义.你需要的是部分专业化:
templatestruct are_convertible { //^^^^^^^^^^^^^^^^^
在此之后,您的代码有效:
class A {}; class B : public A {}; class C {}; class D : public C {}; templatestruct are_convertible; // There are no Args template <> struct are_convertible<> { static const bool value = true; }; // Check if the first two elements are convertible then recurse on the rest template struct are_convertible { static const bool value = std::is_convertible ::value && are_convertible ::value; }; int main() { std::cout << std::boolalpha; std::cout << "Are convertible A->B and C->D: " << are_convertible::value << std::endl; std::cout << "Are convertible B->A and D->C: " << are_convertible::value << std::endl; }
这版画false
和true
,这似乎是对我来说是正确的结果.