C++ 使用接口初始化

  • 本文关键字:初始化 接口 C++ c++
  • 更新时间 :
  • 英文 :


我正在尝试在C++中实现一个可以包含整数、浮点数和分数等的通用value类。所以我编写了一个接口value_interface,并int包装在int_wrapper中以从接口继承。

但是,value(3)不会初始化value对象,因为即使3可转换为可转换为value_interfaceint_wrappervalue_interface也不能直接转换为value。有没有办法使value(3)成为可能?或者有更好的方法可以做到这一点吗?

#include <string>
class value_interface {
public:
virtual std::string to_string() const = 0;
virtual ~value_interface() {}
};
class value {
std::shared_ptr<value_interface> d_ptr_;
public:
value(value_interface* x) { d_ptr_ = std::unique_ptr<value_interface>(x); }
std::string to_string() const { return d_ptr_->to_string(); }
};
class int_wrapper : public value_interface {
int val_;
public:
int_wrapper(const int val) : val_(val) {}
operator int() const { return val_; }
std::string to_string() const override { return std::to_string(val_); }
friend value operator+(int_wrapper x, int_wrapper y);
};
int main() {
value a = 3; // Error    C2440    'initializing': cannot convert from 'int' to 'value'
int_wrapper b = 3; // ok
value_interface& c = static_cast<value_interface&>(b); // ok
value d = &c; // ok
return 0;
}

为每个类创建一个具有专用属性的make_value模板化函数。 例如:

template < typename T >
value make_value( const T& t );
template <>
value make_value< int >( const int& i )
{
return value{ std::make_shared< int_wrapper >( i ) };
}

或者,您可以模板化值构造函数,这将允许您直接执行value v = 3

class value {
std::shared_ptr<value_interface> d_ptr_;
public:
value(value_interface* x) { d_ptr_ = std::unique_ptr<value_interface>(x); }
template < typename T >
value( const T& t );
std::string to_string() const { return d_ptr_->to_string(); }
};
template <>
value::value< int >( const int& i )
:d_ptr_(std::make_shared<int_wrapper>(i))
{
}

最新更新