Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;返回类型的泛型集合的正确方法 我对C++很陌生,很不幸我不能停止用C语言(我以前的语言)思考。 我读了一些书,论坛和C++参考网站,但是我找不到我的问题的答案,所以我想我最好在放弃和写一些丑陋的东西之前尝试一下。_C++_Algorithm_Templates_Generics_Containers - Fatal编程技术网

C++;返回类型的泛型集合的正确方法 我对C++很陌生,很不幸我不能停止用C语言(我以前的语言)思考。 我读了一些书,论坛和C++参考网站,但是我找不到我的问题的答案,所以我想我最好在放弃和写一些丑陋的东西之前尝试一下。

C++;返回类型的泛型集合的正确方法 我对C++很陌生,很不幸我不能停止用C语言(我以前的语言)思考。 我读了一些书,论坛和C++参考网站,但是我找不到我的问题的答案,所以我想我最好在放弃和写一些丑陋的东西之前尝试一下。,c++,algorithm,templates,generics,containers,C++,Algorithm,Templates,Generics,Containers,好的,我们可以开始了。 我有一个抽象方法succesorsFunction的类,我希望它返回指向状态的指针集合。我不想强制实现者使用特定的容器;我宁愿让他们选择(向量、列表等) 看起来是这样的: class Problem { public: virtual list<const State*>::iterator succesorsFunction(const State &state, list<const State*>::iterator resu

好的,我们可以开始了。 我有一个抽象方法succesorsFunction的类,我希望它返回指向状态的指针集合。我不想强制实现者使用特定的容器;我宁愿让他们选择(向量、列表等)

看起来是这样的:

class Problem
{
public:
    virtual list<const State*>::iterator succesorsFunction(const State &state, list<const State*>::iterator result) const = 0;
};
template <typename yourType>
yourType& succesorsFunction(const State &a, yourType &result){//Your return type can be without reference
    //Your body
    return result;
}
sucessorsFunction(b,a);// b is your State object
类问题
{
公众:
虚拟列表::迭代器成功函数(常量状态和状态,列表::迭代器结果)常量=0;
};
这里的问题是list的显式使用。如何在C++中进行?

我曾想过使用模板,但后来遇到了两个问题: 1) 似乎你不能用抽象的方法来做(或者我错了?)
2)如何告诉模板它应该包含指向状态的指针?

< p>不能在C++中基于返回类型重载方法。< /P>

同样,C++中的“容器”没有相同的基(如java中的代码>集合< /COD>),因此不能返回通用容器。

恐怕没有干净的方法来做这件事

我只写重载(按参数)或不同的函数名

关于您的问题:

1) 你可以。什么让你觉得你不能


2) 与声明
列表
的方式相同:
列表
-
常量
是可选的。

您不能拥有虚拟的成员函数模板,但可以尝试实现如下通用函数:

class Problem
{
public:
    virtual list<const State*>::iterator succesorsFunction(const State &state, list<const State*>::iterator result) const = 0;
};
template <typename yourType>
yourType& succesorsFunction(const State &a, yourType &result){//Your return type can be without reference
    //Your body
    return result;
}
sucessorsFunction(b,a);// b is your State object

演绎过程将自动得出结论,即
yourType
实际上是
vector
类型,我认为这解决了您的问题。此外,此体系结构还允许您创建新的类类型MyVector(它包含
状态数组
),并将
MyVector
对象传递给
成功函数

,如果您确实想强制使用STL容器,请尝试以下操作:

template <template <typename, 
                    typename = std::allocator<const State *> > class Container>
 Container<const State*> successorsFunction(const State &state, const Container<const State*> &c) const
 {
    // return something useful.
 }
模板
容器成功函数(const State和State,const Container和c)const
{
//返回有用的东西。
}

如果你坚持让这个函数是虚拟的,那么它就不能是一个成员函数模板,只要用你想要支持的类型重载它,然后你就可以让它们成为虚拟的。

这只是一个详细的回答。请记住,如果返回指针容器,则必须显式释放它们或使用
std::unique\u ptr

仅供参考。。因为你来自C#background

您也可以使用State或模板化它

template<typename Type, 
         template< typename, typename = std::allocator<Type*> > class Container 
        >
Container<Type*> Successor(const Type& x)
{
    Container<Type*> cont;
    // something.
    cont.push_back(new Type(x));
    return cont;   
}
模板类容器
>
容器继任者(常量类型和x)
{
集装箱运输;
//什么。
继续后推(新型(x));
返回控制;
}
叫它

vector<State*> states = Successor<State, vector>(State(10));
向量状态=后继(状态(10));

我想他没有说任何关于通过返回值重载的内容;有多个实现具有相同的返回类型。他只是希望返回类型足够通用,而不是限制实现。@ErnestFriedman Hill他的问题是他想返回集合,但他不想限制集合(尽管代码返回迭代器)。。。。这并没有说明按返回类型重载的问题。我认为1)指的是模板化的虚拟函数,这是您无法做到的。您可以处理泛型容器,您只需要使用迭代器的模板函数。1) Xeo说的话。2) 他指的是通用容器。Boost。Range的类型擦除范围在这里可能会有所帮助。你能详细介绍一下这个功能和虚拟化应该实现什么吗?可能有其他方法。因此,您希望返回类似于
IEnumerable
?@GeorgFritzsche“Problem”的内容是一个接口。我真正想做的是返回一个通用容器,而不是一个具体的容器。@svic完全正确。我觉得我不应该在C++中尝试这样做,但是你如何返回一个特定类型的集合?我试着去做,但是它没有用抽象方法。我不妨删除结尾处的=0,然后结束它。谢谢你的帮助reply@wolfovercats如果您不知道类型,您将如何填充结果?@LuchianGrigore我知道类型;我明白你的意思了。我将使用push_back()。这样,他们仍然可以在向量、列表和队列之间进行选择。好吧,也许我应该把它限制在一个向量上;我不确定这是否值得所有的麻烦这就是我的意思。一个基本的
集合
就很好了,你可以在任何东西上添加
元素。在C++中,你需要推回或添加或插入等。你可以专门化这个函数,但我认为不值得这么麻烦。