具有转发引用的静态多态性

问题描述 投票:3回答:1

我正在尝试使用静态多态性,如下面所示的简单示例。

#include <iostream>

template <typename Derived>
struct Base
{
    decltype(auto) foo() { return static_cast<Derived&>(*this).foo(); }
};

struct Derived : Base<Derived>
{
    void foo() { std::cout << "Derived" << std::endl; }
};

template <typename T>
struct Traits;

template <typename T>
struct Traits<Base<T>>
{
    using Derived = T;
};


template <typename T>
struct Object
{
    template <typename U>
    Object(U&& data) : m_data(std::forward<U>(data)) {}

    T m_data;
};

template <typename T>
decltype(auto) polymorphicCall(T&& obj)
{
    using Derived = typename Traits<std::decay_t<T>>::Derived; 
    return Object<Derived>(static_cast<Derived&>(obj));
}

int main()
{
    Derived d;
    polymorphicCall(d);

    return 0;
}

现在,此代码工作正常,但是如果我希望我的obj函数的polymorphicCall参数被转发引用捕获,该怎么办?

我尝试在模板参数上使用转发引用和enable_if,但后来我无法推断出Base s模板参数。

有没有办法同时使用转发引用和静态多态性?

编辑:更新了代码示例,以包括实际的转发参考以及如何尝试使用它。

显示的错误是:“错误:无效使用了不完整类型'struct Traits'”

链接:https://godbolt.org/z/3EcS47

c++ perfect-forwarding static-polymorphism
1个回答
0
投票

我不确定在示例中您需要知道Derived类型,但是您可以使每个Derived实例化为您提供Base的类型特征:

template <typename>
struct derived_of;

template <typename Derived>
struct derived_of<Base<Derived>>
{
    using type = Derived;
};

并与衰减类型一起使用。


0
投票

例如,使它成为模板模板的捕获参数,例如:

template <template<typename U> typename T>
decltype(auto) polymorphicCall(T&& obj)

祝你好运。

© www.soinside.com 2019 - 2024. All rights reserved.