Синтаксис C ++: использование typedef для приведения типов - PullRequest
2 голосов
/ 28 января 2012

Я просматриваю этот кусок кода и у меня проблемы с синтаксисом:

struct Instance
{
    typedef glm::vec3(*OffsetFunc)(float);

    OffsetFunc CalcOffset;

    glm::mat4 ConstructMatrix(float fElapsedTime)
    {
        glm::mat4 theMat(1.0f);

        theMat[3] = glm::vec4(CalcOffset(fElapsedTime), 1.0f);

        return theMat;
    }
};

Это код C ++, связанный с OpenGL, но мой вопрос не об OpenGL. glm::vec3, vec4, mat4 - это просто векторы размерности 3 и 4, а mat4 - квадратная матрица 4x4. В библиотеке glm перегружены операторы, поэтому такие строки:

theMat[3] = glm::vec4(CalcOffset(fElapsedTime), 1.0f);

работает, как вы могли ожидать, заполняя 4-й столбец theMat 4-мерным вектором, состоящим из 1.0f и этим вызовом типа cast, typedef или вызовом функции, я не совсем уверен, что это такое, и это мой вопрос.

Что означают typedef glm::vec3(*OffsetFunc)(float); и CalcOffset(fElapsedTime)?

Я попытался прочесть здесь: http://en.wikipedia.org/wiki/Typedef#Using_typedef_with_type_casts, но это объяснение, похоже, не имеет смысла для меня.

Редактировать: я знаю, как работают typedef, когда просто требуется предоставить другой псевдоним для типа.

Редактировать 2: Я подумал, что это может быть что-то с указателем на функцию, потому что он выглядит как указатель и имеет float там, как его тип параметра функции, и кажется, что это так , но я все еще не уверен, что именно делает этот вид кода.

Ответы [ 4 ]

4 голосов
/ 28 января 2012
typedef glm::vec3(*OffsetFunc)(float);

определяет OffsetFunc как псевдоним для типа glm::vec3(*)(float), то есть указатель на функцию, принимающий float и возвращающий glm::vec3.

CalcOffset(fElapsedTime)

, вызывает функцию, на которую указываетCalcOffset на fElapsedTime.

4 голосов
/ 28 января 2012

Там нет актеров. Это typedef для указателя на функцию.

Тип OffsetFunc - это указатель на функцию, принимающую float в качестве аргумента и возвращающую glm::vec3.

2 голосов
/ 28 января 2012
typedef glm::vec3(*OffsetFunc)(float);

- один из самых неясных битов синтаксиса C (и C ++).

В нем говорится, что новый тип OffsetFunc является указателем на функцию, которая принимает один параметр, число с плавающей запятой и возвращает glm::vec3.

CalcOffset(fElapsedTime)

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

1 голос
/ 28 января 2012
typedef glm::vec3(*OffsetFunc)(float);

Создает определение типа для указателя на функцию.Функция возвращает glm::vec3 и принимает параметр float.

CalcOffset(fElapsedTime)

Это вызывает функцию, на которую указывает CalcOffset с аргументом fElapsedTime.

...