c++ - 模板化 operator() 重载 C++

标签 c++ templates syntax operators operator-overloading

有人已经问过这个问题,但是这个话题以原始问题没有得到回答而告终。

假设你有这个:

template<size_t i, class f_type>
void call_with_i(f_type f);

functor_type 是:

a) 具有以下签名的方法的结构:

template<size_t i> operator()() const;

<罢工> 或者,b) 看起来像这样的函数:

template<size_t i> foo();

<罢工>

我希望“call_with_i<42>(foo)”等同于“foo<42>()”,但我想不出正确的语法来实现这一点。我会对仅执行 (a) 但 (a)+(b) 会很棒 的解决方案感到满意。我已经尝试过这些语法:

f< i >(); // doesn't work
f()< i >; // doesn't work
f.operator< i >(); // doesn't work
f.operator()< i >; // doesn't work
f.operator()< i >(); // works on msvc, but doesn't work on gcc. 

如何使用显式模板参数调用 operator()? 有没有一种方法可以用同样的语法调用模板化的自由函数来调用它?

附注如果您想知道我用它做什么,那是因为我正在编写一个函数 repeat_to,其中 repeat_to<10>(f) 调用 f(0),然后调用 f(1) ... f(10)。我正在使用它按索引并行遍历多个 boost::fusion vector 。是的,我可以使用迭代器,或者我可以只使用一个命名的成员函数,但我仍然想知道答案。

编辑说明:我删除了一些东西,因为将模板化的自由函数作为 arg 传递没有任何意义。

最佳答案

成员模板是一个从属名称,因为它的语义取决于 f_type 的类型.这意味着你应该在它的名字前加上"template"(以消除“小于”标记的使用歧义),类似于你应该如何放置 typename在从属限定名之前:

template<size_t i, class f_type>
void call_with_i(f_type f) {
  f.template operator()<i>();
  // f.template foo<i>();
}

作为变通方法,您可以使用辅助类型:

template<size_t N> struct size_t_ { }; // or boost::mpl::int_

template<size_t i, class f_type>
void call_with_i(f_type f) {
  f(size_t_<i>());
}

现在,您可以定义您的 operator()如下:

template<size_t i> void operator()(size_t_<i>) const {
  // i was deduced automatically by the function argument. 
}

这对于模板化的构造函数来说很方便,你不能这样做 f_type()<i>()或者其他的东西。在那种情况下,它们将必须是可推导的。

关于c++ - 模板化 operator() 重载 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1762049/

相关文章:

C++ 用宏替换函数

c# - 无法将类型 `double[]` 隐式转换为 `System.Collections.Generic.List<double>`

MySQL:如何按数字选择列?

c++ - 使用模板可以对类型(std::plus,std::minus)之类的对称关系建模吗?

c++ - 为什么必须在哪里放置 “template”和 “typename”关键字?

javascript - script.js 文件未链接到 index.html

c++ - Visual Studio 中的这些 .pch 和 .ncb 文件是什么?

c++ - 如何使用自定义库的 boost 库进行性能测试

具有多重继承的 C++ 构造函数重载解决方案

c++ - 将 Variadic 模板包转换为 std::initializer_list