2015-01-20 4 views
1

В основном то, что я хочу сделать что-то вроде этого:ли два преобразования, определенные пользователем

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.

+0

Я предлагаю добавить parens '(int) (v * 1024)', чтобы убедиться, что он не делает 'int (v) * 1024' там. Конечно, нет никакого оправдания, чтобы не использовать 'static_cast ' здесь anyways :) – sehe

ответ

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 
+0

Большое спасибо, кажется, работает так, как должно. Не могли бы вы объяснить «target() = default;» часть, я думаю, это то же самое, что и «target() {}», но я не знаком с новыми стандартами C++. – prydain

+0

Он явно инструктирует компилятор _still_ генерировать конструктор по умолчанию. Это _different_ от предоставления настраиваемого конструктора по умолчанию (который будет [break podness] (http://coliru.stacked-crooked.com/a/5ab88537a81e9b26)), хотя в этом случае предполагаемый эффект будет точно таким же. – sehe

+0

[Если вам нравятся графические, табличные результаты, слайд 28 из github.com/HowardHinnant/presentations/blob/master/accu_2014/...](http://stackoverflow.com/questions/24342941/what-are-the-rules- для автоматических-поколений-на-перемещение-операции # comment37634197_24342941) – sehe

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