相当于 Java 中 C++ 的 std::bind ?
Equivalent of C++'s std::bind in Java?
在Java中有没有一种方法可以像在C++中使用std::bind一样将参数参数绑定到函数指针?类似这样的Java等价物是什么?
void PrintStringInt(const char * s, int n)
{
std::cout << s << ", " << n << std::endl;
}
void PrintStringString(const char * s, const char * s2)
{
std::cout << s << ", " << s2 << std::endl;
}
int main()
{
std::vector<std::function<void(const char *)>> funcs;
funcs.push_back(std::bind(&PrintStringInt, std::placeholders::_1, 4));
funcs.push_back(std::bind(&PrintStringString, std::placeholders::_1, "bar"));
for(auto i = funcs.begin(); i != funcs.end(); ++i){
(*i)("foo");
}
return 0;
}
这是我认为的逐行翻译,bind
不会1:1映射到任何Java构造;
static void PrintStringInt(String s, int n)
{
System.out.println(s + ", " + n);
}
static void PrintStringString(String s, String s2)
{
System.out.println(s + ", " + s2);
}
interface MyCall {
void fn(String value);
}
public static void main(String[] argv)
{
Vector<MyCall> funcs = new Vector<MyCall>();
funcs.add(new MyCall() {
@Override public void fn(String value) {PrintStringInt(value, 4); }});
funcs.add(new MyCall() {
@Override public void fn(String value) {PrintStringString(value, "bar"); }});
for(MyCall i : funcs){
i.fn("foo");
}
}
恐怕不是,但这段代码是一种模仿C++模板的方法(很差):
abstract class Printer<T> {
final T value;
Printer( T v ) {
value = v;
}
public abstract void print( String s );
}
class PrintStringInt extends Printer< Integer> {
PrintStringInt( int v ) {
super( v );
}
@Override public void print( String s ) {
System.out.printf( "%s, %dn", s, value );
}
}
class PrintStringString extends Printer< String > {
PrintStringString( String v ) {
super( v );
}
@Override public void print( String s ) {
System.out.printf( "%s, %sn", s, value );
}
}
public class BindTest {
public static void main( String[] args ) {
Printer<?>[] funcs = {
new PrintStringInt( 4 ),
new PrintStringString( "bar")
};
for( Printer<?> p : funcs ) {
p.print( "foo" );
}
}
}
输出:
foo, 4
foo, bar
从Java7开始,方法句柄也可以这样做,有关详细信息,请参阅java.lang.invoke.MethodHandle
类的API文档。
使用MethodHandle,这里有一个示例
public class HW
{
int sum;
public HW(int a, int b)
{
super();
this.sum = a+b;
}
public void hello1(double c)
{
double newnumber = sum+c;
System.out.println("hello from hello1, new number= " + newnumber);
}
public void hello2()
{
System.out.println("hello from hello2, sum=" + sum);
}
}
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;
public class TestMethodHandle
{
/**
* @param args
*/
public static void main(String[] args)
{
HW hw = new HW(10, 15);
MethodHandles.Lookup lookup = MethodHandles.lookup();
MethodHandle mh;
try
{
mh = lookup.findVirtual(HW.class, "hello2",
MethodType.methodType(void.class));
mh.invoke(hw);
mh = lookup.findVirtual(HW.class, "hello1",
MethodType.methodType(void.class, double.class));
mh.invoke(hw, 20);
} catch (NoSuchMethodException e)
{
e.printStackTrace();
} catch (IllegalAccessException e)
{
e.printStackTrace();
} catch (Throwable e)
{
e.printStackTrace();
}
}
您可以创建一个具有所需签名的函数的匿名类,该类将调用转发到原始函数。
假设您具有以下功能:
public class StringPrinter {
public void printStringInt( String s, int n ) {
System.out.println( s + ", " + n );
}
public void printStringString( String s, String s2 ) {
System.out.println( s + ", " + s2 );
}
}
然后,您可以创建匿名类,将参数有效地绑定到这些函数。
public static void main( String[] args ) {
public interface Print1String {
public void printString( String s );
}
List<Print1String> funcs = new ArrayList<Print1String);
funcs.add( new Print1String() {
public void printString( String s ) {
new StringPrinter( ).printStringInt( s, 42 );
}});
funcs.add( new Print1String() {
public void printString( String s ) {
new StringPrinter( ).printStringString( s, "bar" );
}});
for ( Print1String func : funcs ) {
func.print1String("foo");
}
}
相关文章:
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- 使用 std::应用于 std::bind
- PCL:当我在setConditionFunction中使用std::bind 时,没有合适的转换函数
- std::bind on statd::array 的运算符 []
- std::bind c++ in if statement
- std::bind 是否实现了 std::ref 和 std::cref 来消除函数调用的歧义?
- C++ 事件管理器的回调,使用 std::function 和 std:bind 以及派生类作为参数
- 试图克服 std::bind 编译错误
- c++ std::bind within function
- std::bind to void* to std::function
- std::bind,无法让具有单个参数的方法工作
- std::bind 和 std::函数术语不值为接受 0 个参数?
- 在调用 std::bind 的产品后意外调用析构函数
- 使用 object 中的方法调用带有 std::bind 和 std::function.target 的 C 样式函数
- 我们应该在使用 std::bind 应用之前检查一个不为空的函数吗?
- 为什么 std::bind 静态类型检查传递给函数的参数?
- 对函数库中的语法感到困惑 std::bind
- std::bind std::shared_ptr 参数不会增加use_count
- c++ 11: bind std::sort用于用户定义的类型,然后使用该绑定作为ctor的参数
- C++如何使用std::bind/std::函数引用模板函数