template static constexpr bool ShaderTypeMatchData(ShaderType type) { bool result = false; switch(type){ case ShaderType::Vertex: { result = std::is_same_v; break; } case ShaderType::Fragment: { result = std::is_same_v; break; } default: break; }
return result; }
template constexpr void VisitData(ShaderType type, DataT data){ VisitBaseOnShaderType( [&data](auto holder) { if constexpr (holder.m_type == ShaderType::Vertex && ShaderTypeMatchData(holder.m_type)) { int val = data.vertex; } }, type ); } template constexpr void VisitBaseOnShaderType(visitor&& visitorFunc, ShaderType shader_type){ switch (shader_type){ case ShaderType::Vertex: { constexpr ShaderType type = ShaderType::Vertex; visitorFunc(ShaderTypeHolder()); break; } case ShaderType::Fragment: { constexpr ShaderType type = ShaderType::Fragment; visitorFunc(ShaderTypeHolder()); break; } default: break; } }
int main(){ VertexData vertex; FragmentData fragment; VisitData(ShaderType::Vertex, vertex); VisitData(ShaderType::Fragment, fragment); return 0; } < /code> с GCC11, компиляция в порядке, но с Clang14, компиляция не стерж.error: no member named 'vertex' in 'FragmentData' int val = data.vertex; ~~~~ ^ test.cpp: note: in instantiation of function template specialization 'VisitData' requested here VisitData(ShaderType::Fragment, fragment); [/code] это вызвано кодом или это ошибка Clang?