Как условно объявить перегрузку члена в шаблонах классов?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как условно объявить перегрузку члена в шаблонах классов?

Сообщение Anonymous »

Я пытаюсь использовать std::enable_if, чтобы условно определить перегрузку члена в шаблоне класса в соответствии с аргументом шаблона:

Код: Выделить всё

#include 
#include 
#include 
#include 
#include 

//------------------------------------------------------------------------------
class MyDouble {
public:
MyDouble(double value_) : value(value_) { /* ... */ };

operator double() const { return value; };

protected:
double value;
};

//------------------------------------------------------------------------------
class Base {
public:
explicit Base(double v1_ = 0.0, double v2_ = 0.0, double v3_ = 0.0);

virtual ~Base() = default;

virtual void update(double d1, double d2, double d3);

double v1;
double v2;
double v3;

};

Base::Base(double v1_, double v2_, double v3_) :
v1(v1_), v2(v2_), v3(v3_) {
/* ... */
}

void Base::update(double d1, double d2, double d3) {
v1 += d1;
v2 += d2;
v3 += d3;
}

//------------------------------------------------------------------------------
template < typename Arg = double >
class Derived : public Base {
public:
explicit Derived(Arg extra_);

virtual ~Derived() = default;

void update(double d1, double d2, double d3) override;

// overload, declared only when Arg == MyDouble
template < typename T = Arg, typename = typename std::enable_if< std::is_same< Arg, MyDouble >::value >::type >
void update(double d1, double d2, double d3, double extra);

Arg extra;
};

template < typename Arg >
Derived< Arg >::Derived(Arg extra_) :
Base(0.0, 0.0, 0.0),
extra(extra_) {
/* ... */
}

template < typename Arg >
void Derived< Arg >::update(double d1, double d2, double d3) {
std::cout 
void Derived< Arg >::update(double d1, double d2, double d3, double extra) {
std::cout  bar(10);

return 0;
}
Однако я понимаю

Код: Выделить всё

In instantiation of ‘class Derived’:
[...]
error: no type named ‘type’ in ‘struct std::enable_if’
что, по крайней мере, говорит мне о том, что условие проверяется. Каков правильный синтаксис SFINAE для достижения желаемого поведения?

Подробнее здесь: https://stackoverflow.com/questions/781 ... -templates
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»