簡體   English   中英

c ++仿函數和函數模板

[英]c++ functor and function templates

考慮這個簡單而毫無意義的代碼。

#include <iostream>

struct A {
    template<int N>
    void test() {
        std::cout << N << std::endl;
    }
};

int main() {
    A a;
    a.test<1>();
}

這是一個非常簡單的函數模板示例。 但是,如果我想用重載的operator()替換A::test以使其成為仿函數呢?

#include <iostream>

struct A {
    template<int N>
    void operator()() {
        std::cout << N << std::endl;
    }
};

int main() {
    A a;
    a<1>(); // <-- error, how do I do this?
}

當然,如果operator()接受了依賴於模板的參數,編譯器可能會推導出模板。 但我無法弄清楚使用無參數仿函數指定模板參數的正確語法。

有沒有正確的方法來做到這一點?

顯然,這個代碼可以工作,因為它繞過了仿函數語法:

a.operator()<1>();

但這有點打敗了它作為仿函數的目的:-P。

你只能打電話

a.operator()<1>();

但那不會使用仿函數。 函數需要一個非模板運算符(),因為它們必須能夠被稱為varname() ,並且不能與您的代碼一起使用。

要使它成為一個真正的仿函數,請將代碼更改為模板類(仿函數是類):

#include <iostream>

template<int N>
struct A {
    void operator()() {
        std::cout << N << std::endl;
    }
};

int main() {
    A<1> a;
    a();
}

除了以下之外,我不知道另一種“直接”的方式:

 a.operator()<1>();

句法。 如果你願意改變代碼,那么將模板參數移動到類就可以了,或者使用(boost | tr1):: bind來創建一個(boost | tr1):: function對象。

您正在嘗試將模板參數傳遞給對象的實例,據我所知,這是不允許的。 您只能將模板參數傳遞給模板函數或模板對象。

a.test <1>(); 和a.operator()<1>(); 因為它們作為模板功能而工作。

使用boost :: bind(檢查boost庫)來修復它。

struct A {
    void operator()(int n) {
        std::cout << n << std::endl;
    }
};

int main(int argc, char* argv[]) {
    A a;
    boost::function<void()> f = boost::bind<void>(a, 1);
    f(); // prints 1

    return 0;
}

而你甚至不必弄亂模板!

你被困住了。 你考慮過這樣的事嗎?

struct A {
    template<int N>
    struct B
    {
        void operator()()
        { std::cout << N << std::endl; }
    };

    template<int N>
    B<N> functor() {return B<N>();}
};

int main()
{
    A a;
    a.functor<1>()();
}

不,沒有辦法繞過它。 就像你說的那樣,你必須明確地調用運算符(這違背了目的),或者模板參數必須能夠由編譯器推導出來。

暫無
暫無

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

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