Обычно плохая идея иметь такое различное поведение для конструктора, основанного исключительно на типе параметра, особенно для встроенных типов, которые легко неявно конвертируются между собой.
Сказав, что, чисто как упражнение по программированию, это можно сделать с помощью одного конструктора, но вам придется использовать прокси-класс с неявным преобразованием из типов, которые будут различаться для достижения того, что вы хотите. Как готовое решение, boost :: option будет соответствовать требованию. Возможно, вы не считаете, что это соответствует требованиям одного конструктора, поскольку он опирается на несколько конструкторов (или шаблон конструктора) второго класса.
class Object
{
public:
Object( const boost::variant< int, double >& val = 0 )
{
switch( val.which() )
{
case 0:
// TODO: Fill array with val
break;
case 1:
// TODO: fill array with val + index
break;
}
}
// TODO: Add array member
};