gpt4 book ai didi

c++ - 如何将带有默认参数的模板函数传递给 std::call_once

转载 作者:太空狗 更新时间:2023-10-29 21:13:31 28 4
gpt4 key购买 nike

我需要在我的模板化单例类中使用 std::call_once 但目前下面的示例代码没有编译:

std::once_flag flag;
class LifeTrackerHelper
{
public:
template<class T>
inline static int SetLongevity(std::unique_ptr<T>& pobj,unsigned int longevity = 0)
{
return 0;
}
};
template<class T>
class Singleton
{
public:
inline static T* getInstance()
{
static std::unique_ptr<T> ptr(new T());
std::call_once(flag,&LifeTrackerHelper::SetLongevity<T>,ptr);
//static int i = LifeTrackerHelper::SetLongevity<T>(ptr);
// if call_once is commented and above line uncommented this will work
return ptr.get();
}
};
class Test
{
public:
void fun()
{
std::cout<<"Having fun...."<<std::endl;
}
};
int main()
{

Singleton<Test>::getInstance()->fun();
}

因此需要帮助以了解如何在此处正确使用 std::call_once。

最佳答案

你的问题是&LifeTrackerHelper::SetLongevity<T>是一个期待 unique_ptr 的函数指针和一个 unsigned int ,但它只会得到一个参数。虽然实际函数具有第二个参数的默认值,但在由函数指针调用时它需要两个参数。

您可以通过传递另一个参数来修复它:

std::call_once(flag, &LifeTrackerHelper::SetLongevity<T>, ptr, 0);

或者您可以将其包装在 lambda 中:

std::call_once(flag, [](std::unique_ptr<T>& p){ return LifeTrackerHelper::SetLongevity<T>(p); }, ptr);

根据 cppreference , 在 C++17 之前 call_once 的参数将被复制或移动。到目前为止,我在传递 unique_ptr 时没有遇到任何错误。 , 但使用 std::ref 可能是明智的在上面。

关于c++ - 如何将带有默认参数的模板函数传递给 std::call_once,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44015883/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com