【发布时间】:2019-12-02 18:41:30
【问题描述】:
我正在使用 decltype 和 std::remove_pointer 来声明类型类,并希望将其传递给 std::bind。
class Result {
public:
Result(){}
~Result(){}
std::string get(const std::string& name) { return name; }
};
typedef std::function<std::string()> MyGet;
int main() {
// OK
Result result1;
MyGet mg1 = std::bind(&Result::get, &result1, std::cref("result1"));
std::cout << mg1() << std::endl;
// OK
Result result2;
MyGet mg2 = std::bind(&decltype(result2)::get, &result2, std::cref("result2"));
std::cout << mg2() << std::endl;
// Failed
Result* result3 = new Result;
MyGet mg3 = std::bind(&decltype(std::remove_pointer(result3))::get, &result3,
std::cref("result3"));
std::cout << mg3() << std::endl;
delete result3;
return 1;
}
代码的 result3 部分显示此错误: 不能在没有模板参数列表的情况下引用类模板“remove_pointer” 如何解决?
【问题讨论】:
-
只是好奇:为什么选择
std::bind而不是使用 lambda? -
std::remove_pointer作用于类型,而不是表达式(这就是为什么语法是typename std::remove_pointer<SomeType>::type,而不是std::remove_pointer(SomeExpression)。 -
你的意思是 result3 是 SomeExpression 吗?这也是构建失败:MyGet mg3 = std::bind(&std::remove_pointer(Result*)::type::get, &result3, std::cref("result3"));
-
使用 lambda:
auto mg1 = [result1] () { return result1.get ("result1"); };并声明getconst。 -
你为什么要尝试使用
remove_pointer来获取result1指向的类型,而你已经知道该类型?这只是Result。
标签: c++ functional-programming