【发布时间】:2016-04-09 13:35:00
【问题描述】:
我阅读了this 的问题并认为它很有趣,所以我开始使用一些代码来看看是否可以让它工作,但我遇到了一个问题。
我的方法是使用函数式编程熟悉的头尾成语。但是,我找不到处理空可变参数模板列表的方法,这将是基本情况。
这是我的代码:
#include <iostream>
#include <type_traits>
class A {};
class B : public A {};
class C {};
class D : public C {};
/*
// Forward declaration
template <typename T1, typename T2, typename... Args>
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 <typename T1, typename T2, typename... Args>
struct are_convertible {
static const bool value = std::is_convertible<T1, T2>::value && are_convertible<Args...>::value;
};
int main() {
std::cout << std::boolalpha;
std::cout << "Are convertible A->B and C->D: " << are_convertible<A, B, C, D>::value << std::endl; // Should be false
}
我目前收到一个错误,指出 'are_convertible' is not a class template,所以我尝试转发声明它,这给出了这个错误:
错误:模板参数的数量错误(0,应至少为 2)
我该如何修正我的方法?
【问题讨论】:
-
你是如何尝试转发声明的?
-
@Petr 编辑了问题。
-
在前向声明中只保留可变参数(即删除
T1和T2)你不累吗? -
好吧,你的专业是错误的。 T1 和 T2 消失了。
-
与您链接的问题不同,您的代码似乎假设调用者希望为每个后续类型对测试
is_convertible。这是故意的吗?
标签: c++ c++11 metaprogramming c++14 variadic-templates