указатель функции на перегруженный член stati c - для использования в качестве специального средства удаления в unique_ptr - PullRequest
0 голосов
/ 27 мая 2020

У меня есть класс со статусом c и перегруженной функцией-членом. Я хочу использовать один из них в качестве пользовательского удаления в unique_ptr, по этому топу c много вопросов, ни один из них не помог мне.

#include <iostream>
#include <memory>
#include <functional>

class A {
    public:
    static void release() {
        std::cout << "void released\n";
    }
    static void release(int*i) {
        std::cout << *i << " released\n";
    }
};

int main()
{
    int i = 10;
    std::unique_ptr<int, decltype(&A::release(int*))> ptr(&i, &A::release); // compiler error
    std::unique_ptr<int, std::function<void(int*)>> ptr(&i, &A::release); // compiler error
    return 0;
}

попробуйте здесь: https://onlinegdb.com/H14txk3sL

1 Ответ

2 голосов
/ 27 мая 2020
std::unique_ptr<int, void(*)(int*)> ptr(&i, &A::release); 
//                   ~~~~~~~~~~~~^

Таким образом, конструктор std::unique_ptr будет ожидать указателя определенного c типа, который поможет компилятору разрешить неоднозначность.


Это:

decltype(&A::release(int*))

не является допустимым синтаксисом. Чтобы использовать decltype(e), вам нужно будет написать decltype(&A::release), но это снова вызовет ошибку двусмысленности, и поэтому он должен будет выглядеть следующим образом:

decltype(static_cast<void(*)(int*)>(&A::release))

, но это многословный способ сказать void(*)(int*).


Это:

std::function<void(int*)>

не помогает в разрешении двусмысленности, потому что конструктор std::functions также является шаблоном, что означает компилятор снова пропускает контекст, который помог бы ему выбрать одну из перегруженных функций.

...