我想通过摆脱一些模板参数来改善代码。我有一个主意,但是在正确的代码上苦苦挣扎。 c ++也可能没有这样的功能,这也很好。
当前代码如下:
class ModelProperties{
public:
string name;
};
class Model{
public:
ModelProperties properties;
};
template <class TModel, class TModelProperties>
class ModelWrapper{
private:
TModel m_model;
public:
ModelWrapper(TModel model){
m_model = model;
}
TModelProperties getProperties(){
return m_model.properties;
}
};
我想要这样的东西:
template <class TModel>
class ModelWrapper{
private:
TModel m_model;
public:
ModelWrapper(TModel model){
m_model = model;
}
TModel + "Properties" getProperties(){
return m_model.properties;
}
};
答案 0 :(得分:1)
这个问题归结为推导findstr
的返回类型。鉴于您确实要返回副本而不是引用,因此有以下等效选项:
ModelWrapper::getProperties
如果您不想在签名中使用auto getProperties() const { return m_model.properties; }
std::remove_reference_t<decltype(TModel::properties)> getProperties() const
{ return m_model.properties; }
关键字(也许出于文档目的),则应为每个auto
的属性声明类型别名:
Model
您可以用它代替class Model {
public:
using properties_t = ModelProperties;
properties_t properties;
};
,如下所示:
auto
或者,如果您的typename TModel::properties_t getProperties() const { return m_model.properties; }
类被定义为模板,如下所示:
Model
您可以这样做:
template <typename TProperties>
class Model {
public:
TProperties properties;
};
在template <template <typename TProperties> class TModel>
class ModelWrapper {
...
TProperties getProperties() const { return m_model.properties; }
};
的实例化过程中自动推导TProperties
。
答案 1 :(得分:0)
您可以简单地使用auto
/ decltype(auto)
或decltype
:
template <class TModel>
class ModelWrapper{
private:
TModel m_model;
public:
ModelWrapper(TModel model) : m_model{model} {}
auto getProperties() const { return m_model.properties; } // Return by copy (unless properties **is** a reference)
};
或
decltype(auto) getProperties() const { return (m_model.properties); } // Extra parenthesis for reference.
或
auto getProperties() const
-> decltype(m_model.properties)& // By reference
{ return m_model.properties; }