【问题标题】:Pass template class instance type alias to non-member template function将模板类实例类型别名传递给非成员模板函数
【发布时间】:2017-12-13 23:20:32
【问题描述】:

有没有办法使用 Base 类对象指针将模板类实例类型别名 (ClassTmplt/DerivedFloat::InternalType) 传递给外部非成员模板函数 (DoSomething)(就像在最后两个 test() 函数注释行中一样) ?

class Base
{
};

template <typename T>
class ClassTmplt:
    public Base
{
public:
    using InternalType = T;
};

class DerivedFloat:
    public ClassTmplt<float>
{
};

template <typename T, typename TIn>
void DoSomething(const TIn value)
{
    T val = T(value);
    std::cout << val << " | " << typeid(val).name() << " | " << typeid(value).name() << std::endl;
}

template <typename T>
typename T::InternalType PassInternalType(T* obj)
{
    return T::InternalType;
    //return obj::InternalType
}


void test()
{
    Base* obj = new DerivedFloat;
    DoSomething<float>(1.23);
    DoSomething<DerivedFloat::InternalType>(1UL);
    //DoSomething<(*obj)::InternalType>(-123);
    //DoSomething<PassInternalType(obj)>(4.56);
}

【问题讨论】:

    标签: c++ templates


    【解决方案1】:

    没有。考虑:

    void f(Base* ptr) {
        // What type does ptr point to?
        // The runtime derived type might not exist when this function compiles
    }
    

    由于指针的动态类型只有在运行时才知道,所以编译器在编译函数时是无法获取到的。

    如果定义可用,可能还有更多选项,但所有选项都需要您提前了解您打算支持的整组类型,并且可能需要先向下转换。 (如果你走这条路,“id”类型可能会有所帮助。)

    您也许可以使用访问者模式构建一些有限的工作设计。

    【讨论】:

    • 谢谢。您所说的向下转换是什么意思 - 基类中的 ID 字段以外的东西包含层次结构中每个类的唯一 ID?我有这样的字段,但是由于我无法将其设为 constexpr,因此我无法制作一个由该 ID 字段专门用于 DoSomething 的模板...
    • 我的意思是,如果派生类公开了一个类型,如果你只知道基类型,你就无法访问它。这就是人们经常使用 CRTP - Curiously Recurring Template Pattern 的原因。基类是模板,参数是派生类的类型,传递自身,因此基类可以使用它。
    • Argh...为什么我还没有关于模板基类:|非常感谢 CPTR。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多