当前位置:  开发笔记 > 编程语言 > 正文

如何解压空的variadic模板列表

如何解决《如何解压空的variadic模板列表》经验,为你挑选了1个好方法。

我读了这个问题并认为它很有趣,所以我开始玩一些代码来看看我是否可以让它工作,但我遇到了一个问题.

我的方法是使用熟悉函数式编程的头尾习语.但是,我找不到处理空的可变参数模板列表的方法,这将是基本情况.

这是我的代码:

#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)

我该如何修复我的方法?



1> Petr..:

你有两个问题.

首先,使用您的前向声明,您说您的模板始终接受至少两个参数(T1T2).如果要为结构不允许任何参数,则需要仅使用variadic参数对其进行前向声明:

template
struct are_convertible;

其次,您的第二个定义不是部分特化,而是与先前的前向声明相矛盾的完整的一般(新的)模板定义.你需要的是部分专业化:

template 
struct are_convertible {
                    //^^^^^^^^^^^^^^^^^

在此之后,您的代码有效:

class A {};
class B : public A {};
class C {};
class D : public C {};

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;
    std::cout << "Are convertible B->A and D->C: " << are_convertible::value << std::endl;
}

这版画falsetrue,这似乎是对我来说是正确的结果.

推荐阅读
mylvfamily
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有