适用于全局模板运算符指定模板参数的适当语法
Proper syntax for specifying template parameters for a global templated operator?
对不起,这是一个琐碎的问题,但是我无法尝试使用几次尝试,而是决定在这里询问。在这种情况下,指定模板参数的正确方法是什么:
#include <sstream>
struct bar
{
int foo = 5;
};
template<size_t i>
std::ostream& operator<<(std::ostream& s, bar b)
{
s << b.foo + i;
return s;
}
int main(int argc, char** argv)
{
std::stringstream s;
bar b;
// Proper way of writing s << bar ?
return 0;
}
您被迫使用长表格来调用操作员,并明确传递模板参数
int main()
{
std::stringstream s;
bar b;
::operator<<<1>(s, b);
return 0;
}
demo
::operator<<<1>(s, b);
语法看起来很奇怪,但专注于::operator<<
部分,该部分是在全局名称空间中引用操作员。由于您已将其写入模板,并且无法从参数中推断出模板参数(size_t
),因此您被迫以<1>
(<2>
,<3>
等)形式使用显式模板参数
由于您的函数模板没有可推论的参数,因此您必须用模板参数明确调用它。它的丑陋。
operator << <4>(s, b);
另一个丑陋的黑客是使用代理 template-class :
template<std::size_t K>
struct bT{
bT(bar& bb) : b(bb) {} bar& b;
static constexpr std::size_t i = K;
};
然后将模板operator <<
修改为:
template<size_t i>
std::ostream& operator<<(std::ostream& s, bT<i> b)
{
s << b.b.foo + b.i;
return s;
}
并打电话:
s << bT<4>(b);
演示..无论如何,我们的面板都击败了这个,最终仍然很丑陋。节省所有人的压力,并使用命名功能。这将更加直观。
相关文章:
- 在标准中,模板参数的语法在哪里定义,例如,'std::function<int(char)>'?
- 将类作为主要参数的语法在哪里需要?
- 初始化对象以在 C++08 中作为参数传递的首选语法是什么?
- 当C++类函数参数之一是结构时,它们的语法有什么不同
- 将显式指定的函数模板重载作为模板参数传递的正确语法是什么?
- 提升::精神::qi::语法和可变参数模板
- C++ 中的默认参数语法和一般语法
- 带有约束的可变参数模板的'requires'表达式的语法是什么?
- C++ C 样式数组作为语法错误的参数
- 使用 MATLAB 语法的 c++ 函数参数?
- 在模板类中的参数包的语法
- 将QMETAMETHOD作为参数传递到使用新的Qobject :: Connect语法的函数
- 在Qt信号和插槽中使用lambda语法并访问传递的参数
- 是否可以在尾随返回类型语法中直接使用参数值(不是其类型,而是值本身)
- 精神语法不会编译:函数模板参数错误?
- 适用于全局模板运算符指定模板参数的适当语法
- hpp文件中的块,这是c ++语法吗?为什么没有传入参数?有人可以解释一下,请
- 有人能解释一下特殊的std::函数模板参数列表语法(这个奇怪的类型(Types..))吗
- 构件和模板参数语法上的指针
- 可变模板模板参数语法