繁体   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