Могу ли я использовать параметр типа в шаблоне для параметра, не являющегося типом?

Я хочу иметь квалифицированную инициализацию класса по умолчанию, даже если конструктор не имеет параметров.

Поэтому я пытаюсь установить значение по умолчанию с определением шаблона, попробовав что-то вроде этого ниже. Инициализировать параметр во время компиляции (если он не указан):

template < class Param_t, Param_t def >
class cParameter
{
public:
    cParameter( Param_t p = def)
        : m_Value(p)
    {}
    Param_t m_Value;
};

Это не работает :-( Добавление: ... с удвоениями или числами с плавающей запятой. Это хорошо работает с целыми числами.

Причина в том, что я хочу заменить элементы структуры в устаревшем коде с минимальным количеством изменений.

typedef struct 
{
    int someVariable;
    float someOtherVariable;
} myStructure_t;

К этому

typedef struct 
{
    cParameter<int> someVariable;
    cParameter<float> someOtherVariable;
} myStructure_t;

Когда эта структура инициализируется в обычном классе

class myClass
{
public:
    myClass()
    : m_Struct()
    {}
    myStructure_t m_Struct;
}

Я получаю сообщение об ошибке (MSVC2013), когда шаблон не имеет инициализации по умолчанию:

template < class Param_t >
class cParameter
{
public:
    cParameter( Param_t p )
        : m_Value(p)
    {}
    Param_t m_Value;
};

Ошибка 42 ошибка C2512: 'myClass::m_Struct': нет подходящего конструктора по умолчанию demo.cpp

Я еще видел следующее:

cParameter< int, 1> m_Works;
cParameter< double, 1.0> m_DontWork;

==> Теперь все вышеизложенное мне ясно. Я только что нашел ответ здесь stackoverflow.com/questions/2183087/… (конструкция разрешена, но НЕ С DATATYPE float или double).

Но как мне просто инициализировать шаблоны с разными значениями ints и double?

typedef struct 
{
    cParameter<int, 42> someVariable;
    cParameter<float, 23.0f> someOtherVariable;
} myStructure_t;

Что делать здесь? Любые подсказки?


person Jesko    schedule 21.02.2018    source источник
comment
TBH, я думаю, что добавление конструктора (и, следовательно, отказ от C-изма, который istypedef struct {), - это путь наименьшего сопротивления.   -  person StoryTeller - Unslander Monica    schedule 21.02.2018
comment
Возможно, вы имеете в виду что-то вроде template <typename Param_t, Param_t def =Param_t{}>; в противном случае, если вы не дадите значение по умолчанию параметру шаблона, отличному от типа, как вы можете написать cParameter<int> someVariable;?   -  person max66    schedule 21.02.2018
comment
Я хотел написать так: ‹br/› typedef struct { cParameter‹int,0› someVariable; cParameter‹float, 1.0f› someOtherVariable; } мояСтруктура_t;   -  person Jesko    schedule 21.02.2018
comment
@StoryTeller, это больше изменений кода ...   -  person Jesko    schedule 21.02.2018
comment
Подожди. Вы сказали VS2013? Поддерживает инициализаторы нестатических элементов данных. Просто напишите int someVariable = 0; и так далее. Это было бы менее утомительно.   -  person StoryTeller - Unslander Monica    schedule 21.02.2018
comment
@StoryTeller Необходимо заменить параметры каким-то классом. Мой вопрос касается инициализации затем. Мне было интересно заставить работать первый образец кода...   -  person Jesko    schedule 21.02.2018


Ответы (1)


Если вы согласны иметь фиксированное значение по умолчанию для каждого типа, вы можете создать тип, чтобы определить его как константу и специализировать его по мере необходимости.

template <typename T> struct MyTypeDefault { static const T value; };
template <typename T> const T MyTypeDefault<T>::value = T();
template <> struct MyTypeDefault<double> { static const double value; };
const double MyTypeDefault<double>::value = 1.0;

template <typename T>
class MyType {
    public:
    MyType() { value = MyTypeDefault<T>::value; }
    private:
        T value;
 };
person Archie Yalakki    schedule 22.02.2018
comment
выглядит немного непрактично. Если у нас есть сотни таких классов и значений по умолчанию... Почему это не работает во всех случаях: template ‹typename T, T v› class MyType { public: MyType() { value = v; } закрытое: значение T; }; - person Jesko; 22.02.2018
comment
Обновление: я только что нашел ответ здесь stackoverflow.com/questions/2183087/ (конструкция разрешена, но НЕ С DATATYPE float или double). Вопрос: почему? - person Jesko; 22.02.2018