【发布时间】:2019-01-21 08:17:14
【问题描述】:
我有一个允许用户编辑 glsl 的统一变量值的工具,我需要将所有数据存储在 std::vector 中。
由于所有变量的值都有不同的变量类型(vec2、vec3、vec4、mat2...等),将它们存储在单个容器中是一个挑战。我决定采用这种方法
class BaseData
{
public:
};
template <typename T>
class Data: public BaseData
{
public:
Data(TypeEnum enumType, T valueIN): value(valueIN), type(enumType)
{
}
T GetValue()
{
return value;
}
TypeEnum GetType()
{
return type;
}
private:
T value;
TypeEnum type;
};
class Material
{
Material(std::vector<Base*> valueVec)
{
for(auto i : valueVec)
{
switch(i->GetType())
{
case BaseColor:
SetBaseColor(i->GetValue());//need something like this
break;
case BaseTexture:
SetBaseTexture(i->GetValue());//need something like this
break;
case EmissionColor:
SetEmissionFactor(i->GetValue());//need something like this
break;
case EmissionTexture:
SetEmissionTexture(i->GetValue());//need something like this
break;
case Material_nProps_NormalTexture:
SetNormalMap(i->GetValue());//need something like this
}
}
}
}
int main()
{
std::vector<BaseData*> uniformValue;
uniformValue.push_back(new Data(BaseColor, glm::vec4(1,2,3,4)));
uniformValue.push_back(new Data(BaseTexture, 0));
uniformValue.push_back(new Data(EmissionColor, glm::vec3(1,1,1)));
uniformValue.push_back(new Data(BaseTexture, 1));
Material PBR(uniformValue);
}
但问题是,现在我如何从基指针中获取 value 而不将其转换为正确的派生类型指针?
【问题讨论】:
-
如果您的可能类型数量有限,请检查
std::variant(或boost::variant,如果您没有 C++17 编译器)和访问者模式 (std::visit)。 -
嗨@Holt 不幸的是,只允许 c++98 :(
-
然后就像霍尔特说的,结帐
boost。 -
我知道提升,但同样不适用于我的场景
-
也许看看'typeid'操作符。