执行两次用户定义的转换

时间:2015-01-20 22:34:07

标签: c++ type-conversion implicit-conversion

基本上我想做的是这样的事情:

struct target {
    int somevalue;
}
struct target_wrapper {
    target t;
    target_wrapper(float v) : t(target{(int)v * 1024}){}
    operator target() { return t; }
}

target t = 1.0f; // would be called as t = (target)((target_wrapper)1.0f)

我无法更改目标结构,因为有代码期望它是POD。我现在认为C ++标准只允许使用一个用户定义的转换,但也许可以使用一些魔术技巧而不是使用函数。

target make_target(float a){ return target{(int)a*1024}; }

target t = make_target(1.0f);

会工作但是它很烦人,因为我真正做的就是将浮点数乘以1024。

1 个答案:

答案 0 :(得分:3)

你可以在它保持POD时添加一个构造函数:

<强> Live On Coliru

struct target {
    int somevalue;
    target() = default;
    constexpr target(float f) : somevalue(static_cast<int>(1024*f)) {}
};

#include <type_traits>
#include <boost/type_traits.hpp>
static_assert(std::is_pod<target>::value,   "expected to be POD");
static_assert(boost::is_pod<target>::value, "expected to be POD");

#include <iostream>

int main() {
    target t = 3.14f;
    std::cout << t.somevalue << "\n";
}

打印

3215