gpt4 book ai didi

C++ 制作通用接口(interface)

转载 作者:行者123 更新时间:2023-11-28 07:04:46 24 4
gpt4 key购买 nike

我有一个接口(interface)(缺少很多成员,但请注意这个接口(interface)是必需的)。我将需要 5 个继承自它的类,它们将具有一个 _value 属性。所以,插入\在实现 5 个类(用于 char、short、int、float、double)时,我想到了一个模板类:

class my_interface
{
public:
virtual [various_types] getValue() const = 0;
};

template<typename T>
class my_class : public my_interface
{
private:
T _value;
public:
my_class(T value) : _value(value) {} // initialize the attribute on construct
virtual T getValue() const { return _value; }
};

...这样类似的东西就可以工作了:

void                my_function()
{
my_inteface* a = new my_class<char>(42);
my_interace* b = new my_class<short>(21);
int result;

result = a->getValue() + b->getValue();
}

但我不知道我该怎么做。看来你不能在纯虚拟界面上制作模板。对我来说,唯一可行的方法是让 getValue() 始终返回 double 值,因为它是我需要的最大类型。但是,我不喜欢这种解决方案。

最佳答案

如果您的界面上只有一种方法 (getValue()),那么您只需要模板类实现。

但是如果你想要这样的界面:

std::string getValue();
int getValue();
long getValue();

那你就倒霉了,因为你不能仅根据返回类型重载函数名。或者,您可以创建包装器类型。

编辑

我所说的包装器类型是指,如果需要 getValue 返回多种类型,您可以使用包装器类以多种方式完成此操作,该包装器类封装了您所需的功能,而不是将其添加到顶级接口(interface)中。它可能看起来像这样:

enum ValType{
INT, CHAR, STR, DEQUE
};

class Wrapper{
private:
union S{
int intVal;
char charVal;
std::string stringVal;
std::deque dequeVal;
~S() {}
} theVal;

ValType heldType;
public:
void setVal(int value){ heldType = INT; theVal.intVal = value; }
void setVal(char value){ heldType = CHAR; theVal.charVal = value; }
// ... and so on
int getIntVal() const {
if(heldType!=INT)
throw std::runtime_error("Cop on");
return theVal.int;
}
// and so on
}

那么你的界面就是

public class my_interface{
virtual Wrapper getVal();
}

你在这里并没有真正获得太多,因为用户仍然需要调用 Wrapper 的正确子成员。如果需要,您也可以只将返回值表示为字符串。

请注意,使用 union 需要注意以下注意事项: http://en.cppreference.com/w/cpp/language/union

编辑 2:你可以用模板化的返回来做到这一点

template<typename = T>
const T& getVal(const T& typeToAllowMethodOverriding) const;

关于C++ 制作通用接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21932199/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com