gpt4 book ai didi

c++ - 模板模板参数的参数推导

转载 作者:搜寻专家 更新时间:2023-10-31 01:06:05 24 4
gpt4 key购买 nike

我有一个类模板。在此类模板中,我试图定义一个成员函数模板,它接受 string 集合上的 const_iterator。集合本身可以是任何类型的 StdLib 集合,但实际上它可以是 vectorlist

由于集合可以是任何类型,我使用 template-template 参数来指定集合类型。但是,它始终是 string 的集合。我希望模板参数推导起作用,这样我就不必在调用成员函数时指定集合类型。

SSCCE 中的代码类似于我的预期用例。

到目前为止,我有类定义(Live Demo):

template <typename Foo>
struct Gizmo
{
Foo mF;
Gizmo (Foo f) : mF (f) {};

template <template <typename> class Cont> void DoIt(
typename Cont <string>::const_iterator begin,
typename Cont <string>::const_iterator end)
{
stringstream ss;
ss << "(" << this->mF << ")\n";
const std::string s = ss.str();
copy (begin, end, ostream_iterator <std::string> (cout, s.c_str()));
}
};

类模板实例化编译成功:

int main()
{
list <string> l;
l.push_back ("Hello");
l.push_back ("world");

Gizmo <unsigned> g (42);
}

然而,当我尝试利用参数推导时(没有它,整个练习几乎毫无意义):

g.DoIt (l.begin(), l.end());

GCC 提示它无法推导模板参数:

prog.cpp: In function ‘int main()’:
prog.cpp:34:28: error: no matching function for call to ‘Gizmo<unsigned int>::DoIt(std::list<std::basic_string<char> >::iterator, std::list<std::basic_string<char> >::iterator)’
g.DoIt (l.begin(), l.end());
^
prog.cpp:34:28: note: candidate is:
prog.cpp:16:49: note: template<template<class> class typedef Cont Cont> void Gizmo<Foo>::DoIt(typename Cont<std::basic_string<char> >::const_iterator, typename Cont<std::basic_string<char> >::const_iterator) [with Cont = Cont; Foo = unsigned int]
template <template <typename> class Cont> void DoIt(
^
prog.cpp:16:49: note: template argument deduction/substitution failed:
prog.cpp:34:28: note: couldn't deduce template parameter ‘template<class> class typedef Cont Cont’
g.DoIt (l.begin(), l.end());

最终我真正关心的是能够在 string 集合上使用开始和结束迭代器调用 DoIt。集合的实际类型可以是 vectorlist,我不想指定模板参数,也不想基于容器重载.

我怎样才能让它工作?

请注意,我的实际用例将在 C++03 中。欢迎使用 C++11 解决方案,但我只能接受 C++03 解决方案。

最佳答案

有几个问题。我为您修复了模板模板参数。我还修改了方法签名,以便您可以自动推断类型,但它需要传入原始集合:

#include <iostream>
#include <vector>
#include <list>
#include <string>
#include <sstream>
#include <iterator>
using namespace std;


template <typename Foo>
struct Gizmo
{
Foo mF;
Gizmo (Foo f) : mF (f) {};

template <template <typename T, typename A = allocator<T> > class Cont> void DoIt(
const Cont <string> &, // deduction
const typename Cont <string>::iterator &begin,
const typename Cont <string>::iterator &end)
{
stringstream ss;
ss << "(" << this->mF << ")\n";
const std::string s = ss.str();
copy (begin, end, ostream_iterator <std::string> (cout, s.c_str()));
}
};

int main()
{
list <string> l;
l.push_back ("Hello");
l.push_back ("world");

Gizmo <unsigned> g (42);
g.DoIt (l, l.begin(), l.end());
}

See it run here.

关于c++ - 模板模板参数的参数推导,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21534181/

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