gpt4 book ai didi

c++ - 延迟函数模板实例化

转载 作者:太空狗 更新时间:2023-10-29 21:03:04 36 4
gpt4 key购买 nike

在这个相当人为的例子中,我试图将一个函数模板传递给我的函数,并希望我的函数在内部实例化函数模板。本质上,我不希望用户知道我的函数的类型和工作原理,而只是能够传递一个函数模板让我实例化自己。自包含示例(不编译):

#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>

template <template <typename InputIt, typename OutputIt> class CopyFunc>
void transferWith( CopyFunc<std::vector<int>::const_iterator,
std::back_insert_iterator<std::vector<int>>> const& func )
{
std::vector<int> source{1, 2, 3, 4, 5, 6, 7};
std::vector<int> sink;

func(source.begin(), source.end(), std::back_inserter(sink));

for (auto&& e : sink)
{
std::cout << e << std::endl;
}
}

int main(int argc, char const *argv[])
{

// I want to pass just the function template in,
// and instantiate it internally
transferWith(std::copy);

return 0;
}

这无法按预期在 gcc-4.7.2 上编译,并出现以下错误:

main.cpp|25 col 27 error| no matching function for call to ‘transferWith(<unresolved overloaded function type>)’
main.cpp|8 col 6 error| note: template<template<class InputIt, class OutputIt> class CopyFunc> void transferWith(const CopyFunc<__gnu_cxx::__normal_iterator<const int*, std::vector<int> >, std::back_insert_iterator<std::vector<int> > >&)
main.cpp|25 col 27 error| note: couldn't deduce template parameter ‘template<class InputIt, class OutputIt> class CopyFunc’

是否有任何技巧或间接方法可以解决这个问题?

谢谢。

最佳答案

为了完整起见,这里有一个仿函数方法的例子:

#include <algorithm>
#include <vector>
#include <iostream>

struct Copy {
template <typename InputIter, typename OutputIter>
OutputIter operator()(InputIter i1, InputIter i2, OutputIter o1) {
return std::copy(i1, i2, o1);
}
};

template <typename CopyFunctor>
void foo(CopyFunctor cf) {
std::vector<int> v1 = {3, 1, 4};
std::vector<int> v2(v1.size());

cf(v1.begin(), v1.end(), v2.begin());

for (auto i : v2) {
std::cout << i << ' ';
}
}

int main() {
foo(Copy()); // displays "3 1 4"
}

关于c++ - 延迟函数模板实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14127360/

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