Сбой шаблона вычитается при использовании оператора преобразования, но работает явное приведение

Я пытаюсь реализовать векторы Swizzle в C ++ с помощью шаблонов программирования. С векторами Swizzle я имею в виду векторы, подобные векторам hlsl и glsl, где, например, если у вас есть вектор v = (1,2,3,4) и делать v.xxyz это производит вектор (1,1,2,3).

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

#include <iostream>
template <typename T>
class vec2
{
public:
template<unsigned a, unsigned b>
class swizzle
{
public:
T v[2];
public:
operator vec2() { return { v[a], v[b] }; }
};

public:
union
{
struct
{
T x, y;
};
swizzle<0, 0> xx;
swizzle<0, 1> xy;
swizzle<1, 0> yx;
swizzle<1, 1> yy;
T v[2];
};
};

template<typename T>
void Foo(const vec2<T>& bar)
{
std::cout << bar.x << ", " << bar.y << "\n";
}

void Bar(const vec2<float> bar)
{
std::cout << bar.x << ", " << bar.y << "\n";
}

int main()
{
vec2<float> v = { 1,2 };
Foo(v.xx); //Does not compile. Template argument deduction fails.

Foo((vec2<float>)v.xx); //Compiles. Prints "1, 1"
Foo(v); //Compiles . Prints "1, 2"
Bar(v.xx); //Compiles without having to explicitly cast it. Prints "1, 1"std::cin.get();
return 0;
}

В приведенном выше примере вызов Foo с аргументом типа swizzle не компилируется, если я не приведу swizzle к vec2<float> даже если swizzle имеет оператор преобразования. Неявное преобразование не работает при работе с шаблонами? Моя проблема в том, что я хотел бы иметь возможность звонить Foo с обоими Foo(v) так же как Foo(v.xy),

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]