我想在参数中接收一个函数,并使用一个参数调用它:
__CODE__并且__CODE__,禁用隐式生成移动构造函数和移动这些类的赋值运算符.并且由于仅移动数据成员__CODE__,隐式复制成员将被删除.
然而,所有这些都是分散注意力的.
您的__CODE__会员注定失败:
public static <T> T foo(Callable<T> func)
{
return func.call("bar");
}
Run Code Online (Sandbox Code Playgroud)
这会创建一个rvalue __CODE__,然后将指针返回到该临时值.客户端之前的临时析构可以读取指向该临时的指针.
你需要做的是__CODE__向下传递给__CODE__基类.然后您不需要持有__CODE__或任何其他数据成员.唯一棘手的部分是__CODE__用正确的方法初始化基类__CODE__:
public static <T> T foo(Callable<T> func)
{
return func.call("bar");
}
Run Code Online (Sandbox Code Playgroud)
现在你将得到隐式的复制成员,事情就会起作用.
一个Callable<T>只有一个方法:T call().
如果您想要不同的东西,则需要使用不同的参数类型,例如:
public interface CallableWithString<T> {
T call(String arg); //Assuming you want a string argument
}
Run Code Online (Sandbox Code Playgroud)
然后你的功能可以做到:
public static <T> T foo(CallableWithString<T> func) {
return func.call("bar");
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
75 次 |
| 最近记录: |