簡體   English   中英

具有模板化參數的函數指針

[英]Function pointer with templated parameter

現在,我有一個智能指針的類模板,該模板具有成員函數指針,因為當用基本函數類型聲明類時,我需要調用派生類的析構函數。 函數指針由以下方式聲明:

void (*d)(const void*);

被定義為:

template<typename T> void DefaultDeleter(const void *p) { delete static_cast<T*>(const_cast<void*>(p)); }

初始化為:

d = &DefaultDeleter<U>;

致電:

d(static_cast<const void*>(px));

我想更改它,所以我不必繼續投射指針,因為我認為它可能會弄亂某些東西。 我想將定義更改為:

template<typename T> void DefaultDeleter(T *p) { delete p; }

可以通過以下方式聲明:

template<typename U> void (*d)(U*);

但是,這不起作用。 有人對此有任何想法嗎? 非常感謝!

這些類的測試有效:

class Base1 {
    protected:
        Base1() : derived_destructor_called(false) {
            printf("Base1::Base1()\n");
        }
    private:
        Base1(const Base1 &); // Disallow.
        Base1 &operator=(const Base1 &); // Disallow.
    protected:
        ~Base1() {
            printf("Base1::~Base1()\n");
            assert(derived_destructor_called);
        }
    protected:
        bool derived_destructor_called;
};

class Derived : public Base1 {
        friend void basic_tests_1();
    private:
        Derived() {}
        Derived(const Derived &); // Disallow.
        Derived &operator=(const Derived &); // Disallow.
    public:
        ~Derived() {
            printf("Derived::~Derived()\n");
            derived_destructor_called = true;
        }
        int value;
};

但是,我在Derived_mi類中收到有關無效指針的內存錯誤,而我能想到的唯一原因是在轉換期間發生了某些事情:

class Base2 {
    protected:
        Base2() : derived_destructor_called(false) {
            printf("Base2::Base2()\n");
        }
    private:
        Base2(const Base2 &); // Disallow.
        Base2 &operator=(const Base2 &); // Disallow.
    protected:
        ~Base2() {
            printf("Base2::~Base2()\n");
            assert(derived_destructor_called);
        }
    protected:
        bool derived_destructor_called;
};

class Derived_mi : public Base1, public Base2 {
        friend void basic_tests_1();
    private:
        Derived_mi() {}
        Derived_mi(const Derived_mi &); // Disallow.
        Derived_mi &operator=(const Derived_mi &); // Disallow.
    public:
        ~Derived_mi() {
            printf("Derived_mi::~Derived_mi()\n");
            Base1::derived_destructor_called = true;
            Base2::derived_destructor_called = true;
        }
        int value;
};

您不能擁有模板化的函數指針,僅因為函數模板的不同實例化是不同的函數 ,並且不能全部由同一指針指向。

查看std::shared_ptr啟發性,它恰好具有特定於類型的刪除器回調。 有效的方式是為特定類型 (而不只是任何類型)創建刪除器。 也就是說, shared_ptr<Foo>具有刪除器,但它是Foo的刪除器,不能用於刪除Bar

除了實際編譯外,它還具有允許創建要與特定類型一起使用的刪除器的優點。 因此,根據您的情況,我建議您不要嘗試更改d的類型; 相反,您應該更改d所存儲的結構,以使其可以容納特定於類型的刪除器,而不是通用的刪除器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM