【发布时间】:2018-09-05 13:03:54
【问题描述】:
我有一个算法(这里没有预设),它以不同的参数(int、float、vectors)作为输入。
我的设计理念是拥有一个包含所有这些不同参数的容器。
为了实现这一点,我有一个基类 Parameter 和一个派生的模板类 TypeParameter。
这些参数将保存在一个容器中。
设计如下:
#pragma once
#include <utility>
#include <memory>
#include <string>
#include <vector>
namespace parameter
{
/*
Interface for parameter
*/
class Parameter
{
public:
Parameter() {}
Parameter(std::string param_name) : name(param_name) {}
Parameter(const Parameter&& other) noexcept : name(std::move(other.name)) {}
virtual ~Parameter() {}
inline const std::string get_name() { return name; }
private:
std::string name;
};
/*
*/
template<class T>
class TypeParameter
: public Parameter
{
public:
TypeParameter(std::string param_name, T new_value) : Parameter(param_name), value(new_value) {}
TypeParameter(const TypeParameter&& other) noexcept : Parameter(std::move(other)), value(std::move(other.T)) {}
inline const T get_value() { return value; }
private:
T value;
};
/*
Container for parameters
*/
class ParameterSet
{
public:
ParameterSet() {}
void add(std::unique_ptr<Parameter> param) { data.push_back(std::move(param)); }
private:
std::vector <std::unique_ptr<Parameter>> data;
};
} //namespace parameter
主要是:
#include <iostream>
#include <string>
#include "Parameter.h"
using parameter::TypeParameter;
using parameter::Parameter;
using parameter::ParameterSet;
void foo(std::unique_ptr<Parameter> p)
{
std::cout << p->get_value(); // ERROR
}
int main(int argc, char *argv[])
{
TypeParameter<int> *iparam = new TypeParameter<int>("ee", 3);
std::unique_ptr<Parameter> p = std::make_unique <TypeParameter<int>>("foo", 3);
foo(std::move(p));
ParameterSet param_set;
param_set.add(std::unique_ptr<Parameter>(iparam));
param_set.add(std::move(p));
getchar();
}
我的问题是我无法在没有演员表的情况下获得价值。
因此,我的问题是如何将 unique_ptr 从 Parameter 类转换为派生的 TypeParameter。 是否有另一种设计容器的方法?
非常感谢!
【问题讨论】:
-
听起来你想要一个
std::variant的容器。 -
如果你有一组有限的参数类型,你想用
std::visit处理std::variant可能是你想要的方式。 -
或者将虚拟方法添加到
Parameter为virtual void print() const = 0 -
我不知道我可以用
virtual void print()做什么。我需要获取参数的值。 -
@FrançoisAndrieux 或
std::any。无论如何,演员是必要的