C++ (g+;+;4.7.1)用等效类typedef替换显式类型名无法编译
我正在尝试创建一个模板函数,它接受一个iterable和一个function,这样传递的函数将隐式地转换为相应类型的C++ (g+;+;4.7.1)用等效类typedef替换显式类型名无法编译,c++,templates,c++11,g++,C++,Templates,C++11,G++,我正在尝试创建一个模板函数,它接受一个iterable和一个function,这样传递的函数将隐式地转换为相应类型的std::function(从而允许它与完整函数和lambda一起使用) 代码如下: #include <iostream> #include <vector> #include <algorithm> #include <typeinfo> template<typename T> void bar(const T
std::function
(从而允许它与完整函数和lambda一起使用)
代码如下:
#include <iostream>
#include <vector>
#include <algorithm>
#include <typeinfo>
template<typename T>
void bar(const T & base, std::function<bool(int)> f) // works
//void bar(const T & base, std::function<bool(typename T::iterator::value_type)> f) // fails to compile
{
std::cout << ((typeid(std::function<bool(int)>) == typeid(std::function<bool(typename T::iterator::value_type)>))?"identical":"distinct") << std::endl;
}
bool filter(int x) { return x%2==0; }
int main() { bar(std::vector<int> {0, 1}, filter); }
我应该注意到,未修改的版本成功地使用了Xcode(设置了适当的选项),但是如果可能的话,我更喜欢使用g++而不是clang。是我做错了什么,还是这是g++中已知的错误?对不起,但是错误在您的代码中。这相当于:
template<typename T> struct S { template<typename U> S(const U &); };
template<typename T> void bar(T, S<T>);
int main() { bar(5, 6); }
指针函数需要第二个重载——然后它将编译。隐式转换到
std::function
不起作用:
void bar(const T & base, bool(*f)(typename T::value_type)){
std::cout << "ptr func\n";
}
然后,编译器将忽略这些T以进行类型推断。嗯,谢谢。我已经实现了另一种(相当可怕的)解决方法,一种不要求调用方引用或派生第二种类型的方法。对于那些不想同时阅读这本书的人来说,这本书本质上是在讨好别人。
template<typename T>
void bar_impl(const T & base, std::function<bool(typename T::iterator::value_type)> f)
{
std::cout << ((typeid(std::function<bool(int)>) == typeid(std::function<bool(typename T::iterator::value_type)>))?"identical":"distinct") << std::endl;
}
template<typename T, typename F>
void bar(const T & base, F &&f)
{
bar_impl<T>(base, std::forward<F>(f));
}
void bar(const T & base, bool(*f)(typename T::value_type)){
std::cout << "ptr func\n";
}
template<class T> struct identity{ typedef T type; };