问题在于:
头文件(库的API的一部分):
template <typename IterType>
void foo(const IterType &begin, const IterType &end);
CPP文件:
template <typename IterType>
void my_really_large_implementation_specific_function(const IterType &begin, const IterType &end) {
// ...
}
是否可以foo()
调用my_really_large_implementation_specific_function()
而不在头文件中包含my_really_large_implementation_specific_function()
的代码,而且不会创建多个模板实例?也许使用某种包装器迭代器类,但我不确定如何。
答案 0 :(得分:4)
在这里查看使用Boost.Range中包含的迭代器的示例:http://geek-cpp.blogspot.fr/2012/11/using-boost-anyiterator-to-hide.html
#include <string>
// note that there is no include to multi_index here!
#include <boost/scoped_ptr.hpp>
#include <boost/range/concepts.hpp>
#include <boost/range/detail/any_iterator.hpp>
class hidden_container; //forward declare the hidden container
class exemple {
public:
boost::scoped_ptr<hidden_container> impl; //hidden container behind pointer
// declare a type erased iterator that can iterate over any container of std::string
// this could be a std::vector<std::string>::const_iterator or a std::list<std::string>::const_iterator
typedef boost::range_detail::any_iterator<
const std::string,
boost::forward_traversal_tag,
const std::string&,
std::ptrdiff_t
> const_iterator;
//ctor
exemple();
// abstracted iterators
const_iterator begin() const;
const_iterator end() const;
};
答案 1 :(得分:2)
你看过boost::any_range了吗?它使用type erasure隐藏模板类型,并将虚拟方法调用作为权衡。
答案 2 :(得分:1)
如果希望函数能够在任意迭代器类型上运行,那么正文需要出现在标题中。
如果只需要支持一种迭代器类型,则它不需要是模板,并且可以出现在源文件中。
答案 3 :(得分:0)
也许你只是想做一个for_each?
// In the header:
void my_really_large_implementation_specific_function(const common_base_class& c);
template <typename IterType>
void foo(const IterType &begin, const IterType &end)
{
std::for_each(begin, end, my_really_large_implementation_specific_function);
}