2014-11-06 3 views
0

Итак, я редактирую свою обертку вокруг программы шейдеров OpenGL. Я пытаюсь изменить его, чтобы использовать шаблоны для функций для установки униформ, так как все они почти одинаковы.Вывод параметра шаблона для параметров, не используемых при вызове функции

Мой желаемый конечный результат для вызова:

aProgram.set_Fglm("uformName", glm::vec3(0, 1, 2)); 

Для вызова функции шаблона:

template<class T, void (*F)(GLint, GLsizei, const GLfloat*)> 
void Shader::set_Fglm(const string& _name, const T& _value) { 
    // do stuff using F() 
} 

с параметрами шаблона <glm::vec3, gl::Uniform2fv>. В настоящее время, у меня есть в моем CPP файл кода:

template void Shader::set_Fglm<glm::vec3, gl::Uniform3fv> 
(const string& _name, const glm::vec3& _value); 

Однако то, что в настоящее время происходит то, что я получаю ошибку во время компиляции, говоря, что параметр шаблона F не может быть выведен. Итак, мне кажется, что мне нужен способ сказать, что, когда мы получаем параметр типа glm :: vec3, мы всегда хотим использовать одну и ту же функцию gl.

Если возможно, я также не возражал бы, если бы, например, мне нужно было позвонить что-то вроде aProgram.set_F3glm. Но если это так, как бы я все еще имел реализацию, написанную только один раз. То, что у меня было, только что хранило перечисление с каждой униформой, которое затем будет проверено, чтобы увидеть, какую функцию вызывать, а функция set всегда будет иметь указатель c.

Извините, если это написано довольно ужасно, но я не совсем уверен, что я делаю.

+0

Вы уверены, что 'gl :: Uniform3fv' имеет эту подпись? –

+0

да. Все возможные функции для F имеют одну и ту же подпись. Кроме того, единственным отличием между функциями float, int и uint является тип указателя. Когда я получу эту работу, я надеюсь использовать то же самое решение для шаблона. – Jagoly

ответ

2

Вы можете написать черты для того, что-то вроде:

template <typename T> struct DefaultF; 

// Specialization 
template <> 
struct DefaultF<glm::vec3> 
{ 
    static constexpr void (*Func)(GLint, GLsizei, const GLfloat*) = &gl::Uniform2fv; 
}; 

template<class T, void (*F)(GLint, GLsizei, const GLfloat*) = DefaultF<T>::Func> 
void Shader::set_Fglm(const string& _name, const T& _value) { 
    // do stuff using F() 
} 

Example

Обратите внимание, что вы можете удалить параметр шаблона F и использовать непосредственно DefaultF<T>::Func в вашей функции.

+0

Отлично работает и даже выглядит аккуратно: D – Jagoly

Смежные вопросы