我已经使用仿函数创建了这个可变参数模板类,以充当另一个对象的工厂。我的类编译得很好,但我无法弄清楚使用正确的语法来实例化对象并调用它的仿函数操作符。这是我的模板类。
$Time1 = date_parse($time);
$seconds1 = $Time1['hour'] * 3600 + $Time1['minute'] * 60 + $Time1['second'];
$Time2 = date_parse($current_time);
$seconds2 = Time2['hour'] * 3600 + Time2['minute'] * 60 + Time2['second'];
$actula_time = $seconds1 - $seconds2;
echo floor($actula_time / 3600) .":". floor(($actula_time / 60)%60) .":". $actula_time%60;
答案 0 :(得分:1)
问题是你有两个版本的可变参数声明,一个用于类,另一个用于方法。我不确定你是否真的想要那个。
调用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;
的情况下使用了两个。因为operator()
没有另一个模板声明,编译器会将其绑定到类使用的声明。因为您声明了两个const char*
,所以它会假设operator()
获得两个模板参数。
在我看来,你应该删除模板类定义(template <typename T, typename... Targs>
class MakeTreeNodeEntry
) - &gt; (class MakeTreeNodeEntry
)并仅使用方法的可变参数模板声明。这样你就可以在没有模板参数的情况下构建你的mk
,但是使用带有任意数量参数的operator(),因为该方法将像其他方法一样使用可变参数模板。
operator()
还需要一个可变参数声明才能让它像template <typename T, typename... Targs> Wt::WTreeTableNode* operator()(Wt::WTreeTableNode *parent, T t, Targs... Fargs) const;
一样工作
使代码正确运行的另一种方法是将variadic模板声明设置为整个类,但删除所有方法的模板声明。通过该声明,您的电话将产生:
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");
这不是那么灵活或优雅。所以我认为你的类根本不应该使用模板声明,但你的方法应该能够使用可变参数模板。