如何调用指向函数指针的指针?

时间:2019-10-10 15:04:46

标签: c++ c++11 function-pointers unique-ptr

通常,我会使用如下语法来调用此函数指针。

//keep for testing
const OriginalDateConstructor = Date;

Date = (function(oldDate) {
  function Date(...args) {
    if (args.length === 0) {
      //override the zero argument constructor
      return new oldDate(Date.now())
    } 
    
    //else delegate to the original constructor
    return new oldDate(...args);
  }
  //copy all properties from the original date, this includes the prototype
  const propertyDescriptors = Object.getOwnPropertyDescriptors(oldDate);
  Object.defineProperties(Date, propertyDescriptors);
  
  //override Date.now
  Date.now = function() {
    return 1570705688585;
  };
  
  return Date;
})(Date);

console.log("same prototype", Object.getPrototypeOf(Date) === Object.getPrototypeOf(OriginalDateConstructor))
console.log("no argument", new Date());
console.log("single argument - zero", new Date(0));
console.log("single argument - non-zero", (new Date(new OriginalDateConstructor("2019-01-01").getTime())));
console.log("passing ISO string", new Date("2019-06-01"));
console.log("passing year, month", new Date(2019, 09));
console.log("passing year, month, day", new Date(2019, 09, 15));
console.log("passing year, month, day, hour", new Date(2019, 09, 15, 10));
console.log("passing year, month, day, hour, minutes", new Date(2019, 07, 15, 10, 30));
console.log("passing year, month, day, hour, minutes, seconds", new Date(2019, 07, 15, 10, 30, 45));
console.log("passing in a date", new Date(new Date("2019-03-01")))

console.log("conversion to number", +new Date("2019-06-01T12:00"))
console.log("implicit conversion to string", "" + new Date("2019-06-01T12:00"))

将函数指针包装在unique_ptr中时...

using func_ptr = void (*)();

// ...

(*func_ptr)();

...如何调用一个指向函数指针的指针?我尝试过...

std::unique_ptr<func_ptr> fp;

fp = std::make_unique<func_ptr>((func_ptr) dlsym(handle, "somefunc"));

无济于事。

1 个答案:

答案 0 :(得分:2)

  

将函数指针包装在unique_ptr中时...

这是一个问题,因为这没有道理。智能指针用于具有明确定义的生命周期的事物。您可以创造和破坏的事物。请注意,在CC++中,函数具有无限的生命周期,因此,没有必要使用指向函数的智能指针。

现在,由于您正在使用dlsym,因此涉及动态库(这是标准之外的)。您可能会想:“是的,因为我的函数是从dll加载的,所以它的生命周期是有限的,因此是时候使用智能指针了。”

想法可能很好,但是请注意,这里用于管理的资源不是功能,而是库本身。您正在用dlopen打开dll,并用dlclose将其关闭。因此,库的句柄应由智能指针管理!这意味着智能指针仍然不是一个好选择。

一个正确的解决方案是使用boost::dll(仅标头库),它以非常好的方式为您完成此操作。

如果您想自己动手,则需要:

  • 将管理dll生存期(加载时间)的类-可由std::shared_ptr
  • 管理
  • 表示dll中函数的类。他们可以将shared_ptr保留在dll类中,以确保只要有任何类在该dll中持有指向函数的指针,就可以确保dll被加载。