【发布时间】:2015-10-23 11:37:39
【问题描述】:
我有以下代码:
#include <functional>
template <typename T>
class TD; // For displaying type
void f(int, int, int) { }
int main() {
auto g = std::bind(f, std::placeholders::_1, 2, 2);
TD<decltype(g)> td1;
return 0;
}
在这段代码中,TD 是一个模板技巧,用于显示通过 decltype 传递的模板参数。
编译器的输出如下(在C++14模式下编译):
prog.cpp: In function 'int main()':
prog.cpp:10:18: error: aggregate 'TD<std::_Bind<void (*(std::_Placeholder<1>, int, int))(int, int, int)> > td1' has incomplete type and cannot be defined
TD<decltype(g)> td1;
^
嗯,不完整的类型错误当然除外。但是让我对这个错误消息感到好奇的是std::_Bind<void (*(std::_Placeholder<1>, int, int))(int, int, int)>。我可以理解std::_Bind 是一个代理类,它定义了operator() 并使我们的目的成为可能。但它的模板参数void (*(std::_Placeholder<1>, int, int))(int, int, int) 让我惊叹!我应该如何解释它?它在用户域代码中有什么用处吗?如何使用此声明创建自己的类?
【问题讨论】:
标签: c++ function templates c++11 c++14