#include <type_traits>
namespace foo {
struct Vector {
double x, y, z;
Vector(double x, double y, double z) :
x{x}, y{y}, z{z}
{}
template<class T>
Vector(const T& foreign) :
x{foreign.x}, y{foreign.y}, z{foreign.z}
{}
template<class T
,
class = typename std::enable_if<
std::is_constructible<T, double,double,double>::value
>::type
>
operator T() const
{
return T{x, y, z};
}
};
Vector makeAVector()
{
return {1, 2, 3};
}
}
namespace bar {
struct Vector3 {
using Scalar = double;
Scalar x, y, z;
Vector3(Scalar x, Scalar y, Scalar z) :
x{x}, y{y}, z{z}
{}
Vector3(const Vector3& other) :
x{other.x}, y{other.y}, z{other.z}
{}
Vector3(const Scalar *ptr) :
x{ptr[0]}, y{ptr[1]}, z{ptr[2]}
{}
};
void doSomething(const Vector3& v, double* x)
{}
void doSomething(const Vector3& v, const Vector3& x)
{}
}
int main()
{
bar::Vector3 a{2, 3, 4};
bar::doSomething( a, foo::makeAVector() );
}
I2luY2x1ZGUgPHR5cGVfdHJhaXRzPgoKbmFtZXNwYWNlIGZvbyB7CiAgICBzdHJ1Y3QgVmVjdG9yIHsKICAgICAgICBkb3VibGUgeCwgeSwgejsKCiAgICAgICAgVmVjdG9yKGRvdWJsZSB4LCBkb3VibGUgeSwgZG91YmxlIHopIDoKICAgICAgICAgICAgeHt4fSwgeXt5fSwgent6fQogICAgICAgIHt9CgogICAgICAgIHRlbXBsYXRlPGNsYXNzIFQ+CiAgICAgICAgVmVjdG9yKGNvbnN0IFQmIGZvcmVpZ24pIDoKICAgICAgICAgICAgeHtmb3JlaWduLnh9LCB5e2ZvcmVpZ24ueX0sIHp7Zm9yZWlnbi56fQogICAgICAgIHt9CgoKICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUCiAgICAgICAgICAgICAgICAgLAogICAgICAgICAgICAgICAgIGNsYXNzID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8CiAgICAgICAgICAgICAgICAgICAgIHN0ZDo6aXNfY29uc3RydWN0aWJsZTxULCBkb3VibGUsZG91YmxlLGRvdWJsZT46OnZhbHVlCiAgICAgICAgICAgICAgICAgICAgID46OnR5cGUKICAgICAgICAgICAgICAgICA+CiAgICAgICAgb3BlcmF0b3IgVCgpIGNvbnN0CiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gVHt4LCB5LCB6fTsKICAgICAgICB9CiAgICB9OwoKCiAgICBWZWN0b3IgbWFrZUFWZWN0b3IoKQogICAgewogICAgICAgIHJldHVybiB7MSwgMiwgM307CiAgICB9Cn0KCgpuYW1lc3BhY2UgYmFyIHsKCiAgICBzdHJ1Y3QgVmVjdG9yMyB7CiAgICAgICAgdXNpbmcgU2NhbGFyID0gZG91YmxlOwoKICAgICAgICBTY2FsYXIgeCwgeSwgejsKCiAgICAgICAgVmVjdG9yMyhTY2FsYXIgeCwgU2NhbGFyIHksIFNjYWxhciB6KSA6CiAgICAgICAgICAgIHh7eH0sIHl7eX0sIHp7en0KICAgICAgICB7fQoKICAgICAgICBWZWN0b3IzKGNvbnN0IFZlY3RvcjMmIG90aGVyKSA6CiAgICAgICAgICAgIHh7b3RoZXIueH0sIHl7b3RoZXIueX0sIHp7b3RoZXIuen0KICAgICAgICB7fQogICAgICAgIAogICAgICAgIFZlY3RvcjMoY29uc3QgU2NhbGFyICpwdHIpIDoKICAgICAgICAgICAgeHtwdHJbMF19LCB5e3B0clsxXX0sIHp7cHRyWzJdfQogICAgICAgIHt9CgogICAgfTsKCiAgICB2b2lkIGRvU29tZXRoaW5nKGNvbnN0IFZlY3RvcjMmIHYsIGRvdWJsZSogeCkKICAgIHt9CgogICAgdm9pZCBkb1NvbWV0aGluZyhjb25zdCBWZWN0b3IzJiB2LCBjb25zdCBWZWN0b3IzJiAgeCkKICAgIHt9Cgp9CgoKaW50IG1haW4oKQp7CiAgICBiYXI6OlZlY3RvcjMgYXsyLCAzLCA0fTsKCiAgICBiYXI6OmRvU29tZXRoaW5nKCBhLCBmb286Om1ha2VBVmVjdG9yKCkgKTsKfQo=