float! = Vector4. Весь ваш класс (IShader) основан на шаблоне A_Type, а не только на методе addProperty. / Wp64 не имеет ничего общего с чем-либо. Для решения этой проблемы потребуется больше контекста. Возможно, вы захотите определить addProperty как функцию-член шаблона, а не как шаблон IShader (или в дополнение к нему).
Опять же, это будет трудно понять, не зная точно, что вы делаете, но я подозреваю, что вам нужна гетерогенная коллекция свойств. Чтобы сделать это безопасно, вам нужно применить проверку во время выполнения.
class ISharderProperty {
public:
virtual ~IProperty() {}
};
template<typename ShadeType>
class IShader;
template <typename T>
class ShaderProperty : public IShaderProperty {
IShader<T> *m_shader;
...
};
template<typename ShadeType>
class IShader {
ShadeType shade(...) = 0;
protected:
map<string, IShaderProperty*> m_shaderProperties;
template<typename T>
void addProperty(ShaderProperty<T>* prop, string name) {
m_shaderProperties[name] = prop;
}
template<typename T>
void getProperty(const string& name, ShaderProperty<T>** outProp) {
map<string, IShaderProperty*>::iterator i = m_shaderProperties.find(name);
*outProp = NULL;
if( i != m_shaderProperties.end() ) {
*outProp = dynamic_cast<ShaderProperty<T>*>( *i );
}
}
};
Вам придется использовать getProperty, как
ShaderProperty<float> *x;
ashader.getProperty("floatprop", &x);
if( x ) {
...
}
В качестве альтернативы, getProperty может напрямую возвращать значение, но тогда вам нужно будет дважды упомянуть T, например,
ShaderProperty<float> *x = ashader.getProperty<float>("floatprop");
if( x ) { ... }
Вы заметите, что я использую dynamic_cast
и проверяю на NULL. Если у вас есть какой-то другой механизм для сопоставления имен свойств с типами свойств, вы можете использовать его вместо static_cast
. С dynamic_cast
.
связаны некоторые накладные расходы времени выполнения.