通常,我会使用如下语法来调用此函数指针。
//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"));
无济于事。
答案 0 :(得分:2)
将函数指针包装在unique_ptr中时...
这是一个问题,因为这没有道理。智能指针用于具有明确定义的生命周期的事物。您可以创造和破坏的事物。请注意,在C
和C++
中,函数具有无限的生命周期,因此,没有必要使用指向函数的智能指针。
现在,由于您正在使用dlsym
,因此涉及动态库(这是标准之外的)。您可能会想:“是的,因为我的函数是从dll加载的,所以它的生命周期是有限的,因此是时候使用智能指针了。”
想法可能很好,但是请注意,这里用于管理的资源不是功能,而是库本身。您正在用dlopen
打开dll,并用dlclose
将其关闭。因此,库的句柄应由智能指针管理!这意味着智能指针仍然不是一个好选择。
一个正确的解决方案是使用boost::dll
(仅标头库),它以非常好的方式为您完成此操作。
如果您想自己动手,则需要:
std::shared_ptr
shared_ptr
保留在dll类中,以确保只要有任何类在该dll中持有指向函数的指针,就可以确保dll被加载。