簡體   English   中英

我怎么稱呼我的模板可變函子對象? 我對應該使用的參數和調用的Synthax感到困惑。

[英]How can I call my template variadic functor object? I am confused about the parameters and the calling synthax I should use.

我已經創建了一個帶有函子的可變參數模板類,以充當另一個對象的工廠。 我的類可以很好地編譯,但是我無法找出用於實例化對象並調用其函子運算符的正確語法。 這是我的模板類。

// factory
template <typename T, typename... Targs>
class MakeTreeNodeEntry {
public:
MakeTreeNodeEntry();
Wt::WTreeTableNode* operator()(Wt::WTreeTableNode *parent, T t, Targs... Fargs) const;

protected:
    template <typename T, typename... Targs>
    void addColumnValue(Wt::WTreeTableNode *node, int iindex, T t) {
        Wt::WText* ptextwidget = new Wt::WText(static_cast<const char*>(t));
        //ptextwidget->addStyleClass("ellipsis");
        node->setColumnWidget(++iindex, ptextwidget);
    }

    template <typename T, typename... Targs>
    void addColumnValue(Wt::WTreeTableNode *node, int iindex, T t, Targs... Fargs) {
        Wt::WText* ptextwidget = new Wt::WText(static_cast<const char*>(t));
        //ptextwidget->addStyleClass("ellipsis");
        node->setColumnWidget(++iindex, ptextwidget);
        addColumnValue(node, iindex, Fargs...); // recursive call
    }

    friend class Wt::WTreeNode;
private:

};

    template <typename T, typename... Targs>
inline MakeTreeNodeEntry<T, Targs...>::MakeTreeNodeEntry(){}

template <typename T, typename... Targs>
inline
     Wt::WTreeTableNode* MakeTreeNodeEntry<T, Targs...>::operator()
     (Wt::WTreeTableNode *parent, T t, Targs... Fargs)
    const {

    int i = 0;
    const char* pvalue = static_cast<const char*>(t);
    Wt::WTreeTableNode *node = new Wt::WTreeTableNode(pvalue, 0, parent);
    //node->label()->addStyleClass("truncate");
    addColumnValue(node, i, Fargs...);

    Wt::WInteractWidget *itemwidget;
    if (Wt::WApplication::instance()->environment().ajax())
        itemwidget = node->impl();
    else
        itemwidget = node->label();

    itemwidget->clicked().connect(std::bind([=]() {
        int ii = 0;
    }));

    return node;
}




// trying to call in the main
int main()
{
    Wt::WTreeTableNode *root = new Wt::WTreeTableNode("User's Ads");
    treeTable->setTreeRoot(root, "Ads");

    Wt::WTreeTableNode *group;

    group = new Wt::WTreeTableNode("Agriculture", 0, root);
    MakeTreeNodeEntry<const char*, const char*> mk;
    mk(group, "P&G Credits House", "Best of Market Offering", 
    "2016/01/04", "2016/03/04", "178", "2016/01/04");

    ...
    return 0;
}

問題是您有兩個版本的可變參數聲明,一個用於 ,另一個用於其方法 我不確定您是否真的想要那個。

調用mk(group, "P&G Credits House", "Best of Market Offering", "2016/01/04", "2016/03/04", "178", "2016/01/04"); 調用會獲得許多const char* ,而在akeTreeNodeEntry<const char*, const char*> mk;情況下,您的類實例僅使用了兩個akeTreeNodeEntry<const char*, const char*> mk; 由於operator()沒有其他模板聲明,因此編譯器會將其綁定到類使用的模板聲明。 因為您聲明了兩個const char*所以將假定operator()得到兩個模板參數。

我認為您應該刪除模板類定義( template <typename T, typename... Targs> class MakeTreeNodeEntry )->( class MakeTreeNodeEntry ),並僅將可變參數模板聲明與方法一起使用。 這樣,您就可以在不使用模板參數的情況下構建mk ,但是可以根據需要使用具有盡可能多參數的operator(),因為該方法將像其他方法一樣使用可變參數模板。

operator()需要一個可變參數聲明,以使其像template <typename T, typename... Targs> Wt::WTreeTableNode* operator()(Wt::WTreeTableNode *parent, T t, Targs... Fargs) const;

使您的代碼正確運行的另一種方法是將可變參數模板聲明設置為整個類,但刪除所有方法的模板聲明。 使用該聲明,您的呼叫將導致:

MakeTreeNodeEntry<const char*, const char*, const char*, const char*, const char*, const char*> mk;
mk(group, "P&G Credits House", "Best of Market Offering", 
"2016/01/04", "2016/03/04", "178", "2016/01/04");

這不是那么靈活或優雅。 因此,我認為您的類根本不應該使用模板聲明,但是您的方法應該可以使用可變參數模板。

暫無
暫無

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

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