如何使用std :: call_once重载函数

时间:2017-05-17 07:45:32

标签: c++ multithreading c++11 c++14

除了这个问题How to pass template function with default arguments to std::call_once通过在使用函数指针时传递偶数默认参数来解决,但现在当我在实际代码中尝试此解决方案时,我发现它不起作用,因为还有一个重载函数:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

因此在std :: call_once

中使用重载函数时有任何特殊规则

1 个答案:

答案 0 :(得分:2)

您可以使用static_cast<>()指定您所指的过载。例如,

 std::call_once(flag,
         static_cast<int (*)(std::unique_ptr<T>&, unsigned int)>(
                 &LifeTrackerHelper::SetLongevity<T>),
         std::ref(ptr), 0);

您也可以使用临时变量获得相同的效果。

int (*initfn)(std::unique_ptr<T>&, unsigned int) =
        &LifeTrackerHelper::SetLongevity<T>;
std::call_once(flag, initfn, std::ref(ptr), 0);
相关问题