Anonymous
Как условно объявить перегрузку члена в шаблонах классов?
Сообщение
Anonymous » 15 мар 2024, 23:52
Я пытаюсь использовать 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
1710535946
Anonymous
Я пытаюсь использовать std::enable_if, чтобы условно определить перегрузку члена в шаблоне класса в соответствии с аргументом шаблона: [code]#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; } [/code] Однако я понимаю [code]In instantiation of ‘class Derived’: [...] error: no type named ‘type’ in ‘struct std::enable_if’ [/code] что, по крайней мере, говорит мне о том, что условие проверяется. Каков правильный синтаксис SFINAE для достижения желаемого поведения? Подробнее здесь: [url]https://stackoverflow.com/questions/78169536/how-to-conditionally-declare-a-member-overload-on-class-templates[/url]