int flag = 42;
B b;
if (flag)
b = B(42);
else
b = B("string");
return 1;
скомпилированное с O2 в VS2015
вызывает:
Default constructor;
Int constructor;
Operator = ;
Mercury13: Да я понимаю, вообще я бы остановился на указателе. Но как я написал в UPD вопрос в том можно ли вообще обойтись без издержек в такой задаче.
Вариант с инит наверное самый правильный в таком случае, но это надо иметь доступ к внутренностям класса(а это не всегда так и не всегда можно править).
Второе я так понимаю, это как раз init без редактирования исходного класса.
Оверхеда во втором случае порядочно набегает, в первом случае один лишний call, что наверное не страшно, но я все ещё жадный.
Последний абзац был именно про это.
1) Необходимость delete(надо не забыть написать, а если эксепшен, ну т.д.), решаемо unique_ptr
2) Лишний указатель, 4-8 байт памяти, а я жадный.
3) На счет оверхеда при разыменовании я не помню, а смотреть лень.
> попытаться засунуть аргументы "как есть", а там функция пусть сама решает, что и зачем
Если я правильно понял о чем речь, то вот пример (смотреть на '...')
int printf ( const char * format, ... );
Ну или шаблоны