对参数包执行 dynamic_cast

问题描述

考虑这样的代码

struct A
{
    A() = default;
    virtual ~A() = default;
};

struct B : public A
{
    B() = default;
    virtual ~B() = default;
};

struct C : public A
{
    C() = default;
    virtual ~C() = default;
};

struct D : public A
{
    D() = default;
    virtual ~D() = default;
};

struct E : public A
{
    E() = default;
    virtual ~E() = default;
};


template <typename CLASS1,typename CLASS2>
bool AreObjectsEqual(std::vector<A*>& vec)
{
    return std::all_of(vec.begin(),vec.end(),[](const auto v) { return (dynamic_cast<CLASS1*>(v) != nullptr || dynamic_cast<CLASS2*>(v) != nullptr); });
}

int main()
{
    std::vector<A*> vec = { new D{},new C{} };
    std::cout << AreObjectsEqual<D,C>(vec) << std::endl;
    std::vector<A*> vec1 = { new D{},new C{},new E{} };
    std::cout << AreObjectsEqual<E,C>(vec) << std::endl;
    return 0;
}

以上代码检查指针向量是否包含可以转换为某些类的对象。 但我真正想做的是检查更多这两个模板。类似的东西:

template <typename... CLASSES>
bool AreObjectsEqual(std::vector<A*>& vec)
{
    return std::all_of(vec.begin(),[](const auto v)
        {
            bool false = true;
            for(auto CLASS : CLASSES)
                retValue ||= (dynamic_cast<CLASS*>(v) != nullptr);

            return retValue;
        });
}

std::cout << AreObjectsEqual<B,C,D,E>(vec) << std::endl;

有可能实现吗?每个带参数包的代码示例也有一个带参数包的参数,我不需要那个。我只需要知道如何迭代模板...类

解决方法

在 C++17 及更高版本中,您可以使用折叠表达式。

template <typename... CLASSES>
bool AreObjectsEqual(std::vector<A*>& vec)
{
    return std::all_of(vec.begin(),vec.end(),[](const auto v)
        {
            return (... || (dynamic_cast<CLASSES*>(v) != nullptr));
        });
}

在 C++11 和 14 中,有一个有点混淆的习惯用法。

template <typename... CLASSES>
bool AreObjectsEqual(std::vector<A*>& vec)
{
    return std::all_of(vec.begin(),[](const auto v)
        {
            bool retVal = false;
            using expand = int[];
            (void)expand{retVal = retVal || (dynamic_cast<CLASSES*>(v) != nullptr)...};
            return retVal;
        });
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...