gpt4 book ai didi

c++ - 将模板类实例类型别名传递给非成员模板函数

转载 作者:行者123 更新时间:2023-11-28 01:39:33 33 4
gpt4 key购买 nike

有没有办法使用 将模板类实例类型别名 (ClassTmplt/DerivedFloat::InternalType) 传递给外部非成员模板函数 (DoSomething) Base 类对象指针(就像最后两行 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);
}

最佳答案

没有。考虑:

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

由于指针的动态类型只在运行时才知道,编译器在编译函数时不可能访问它。

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

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

关于c++ - 将模板类实例类型别名传递给非成员模板函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47803594/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com