我正在尝试使用如下所示的简单示例中的静态多态性。
#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;
}
问题是T
inpolymorphicCall
被推断为Derived
,这样任何东西都可以传递给该函数,甚至int
。有没有办法只接受Base<Derived>
类型?
我尝试使用转发引用和enable_if
on 模板参数,但是我无法推断出Base
s 模板参数。
有什么方法可以同时使用转发引用和静态多态性?
编辑:更新了代码示例以包含实际的转发参考以及如何尝试使用它。
显示的错误是:“错误:不完整类型'struct Traits'的无效使用”