此问题引出了更准备,所以我首先提供的码的一些比特,然后将确切问题如何推断迭代器模板类型或其模板的嵌套类型?
假设我有以下类型声明
template<typename T>
struct some_type
{
T t_;
};
这将与工厂函数来构造,像这样
typedef float numeric_type;
std::vector<std::string> construction_material;
//Push_back of strings in certain form...
std::vector<std::unique_ptr<some_type<numeric_type>> instances;
build_instances(construction_material.begin(), construction_material.end(), back_inserter(instances));
和建设中的作用将是像以下
template<typename input_iterator, typename output_iterator>
output_iterator build_instances(input_iterator begin, input_iterator end, output_iterator out)
{
for(input_iterator iter = begin; iter != end; ++iter)
{
//This won't work, but to illustrate some ideas...
//build_instance<std::iterator_traits<output_iterator>::value_type>(*iter)
}
//[...]
return *out;
}
template<typename T>
std::unique_ptr<some_type<T>> build_instance(std::string const& material)
{
static_assert(std::is_floating_point<T>::value == true, "The template type needs to be a floating point type.");
std::unique_ptr<some_instance<T>> instance(new some_instance<T>());
//Some processing...
return instance;
}
我知道我可以改变函数返回一些容器(或者甚至模板化容器类型),像
template<typename input_iterator, typename T>
std::vector<std::unique_type<T>> build_instances(input_iterator begin, input_iterator end,
output_iterator out)
{
//Likewise code to the previous snippets...
return ...
}
我一直没能解决的问题是:
- 使用back_inserter类似的方法有可能 - 或不可能吗?它看起来对于呼叫者来说是最灵活的?
- 如何获得在build_instances体上numeric_type保持(如拥有它通过output_iterator),以便它可以在建设情况一个接一个被使用?
- 如何确保调用者知道要等待包装在std :: unique_ptrs中的对象?另一种选择就像普通的指针一样,但我对此不感兴趣。
对于标题How can I make this template method more elegant? (or: less explicit template parameters required),有一个类似的问题,它接受一个容器并将其转换为不同类型的容器。
编辑 作为评论到Jogojapan的评论,目前我将输入像这样
std::transform(construction_material.begin(), construction_material.end(), std::inserter(instances, instances.begin()), build_instance<numeric_type>);
,但随后的函数调用需要提供的
看起来我错了,但为了教育和所有的目的,是否可以进一步减少typedef数字类型的需求并从迭代器中推导出它?numeric_type
的typedef过,这是有点麻烦。我希望避免这种情况。
对于问题2,可能类似decltype(*((* it).front()。get()))会起作用吗? – Moritz 2012-08-15 10:30:15
'some_type'的作用/意义是什么?在你的例子中,调用者准备一个'vector >',但是'build_instances()'似乎填充了一个'vector >>,或者我误解了任何东西。另外,在'build_instance()'中,您似乎将类型的名称从'some_type '切换为'some_instance '。 –
jogojapan
2012-08-15 12:40:06
@Moritz,我会在一段时间后再回来。 – Veksi 2012-08-15 13:34:23