有没有一种方法可以根据模板参数和字符串在模板类中生成类型

时间:2019-05-27 08:31:49

标签: c++ templates generics

我想通过摆脱一些模板参数来改善代码。我有一个主意,但是在正确的代码上苦苦挣扎。 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;
}

};

2 个答案:

答案 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; }
相关问题