【问题标题】:how to correctly make template operator T() work with funcs like printf?如何正确使模板运算符 T() 与 printf 等函数一起使用?
【发布时间】:2015-03-26 21:16:58
【问题描述】:

我正在对 MyVal 类进行自动编码/解码 像

template<typename T>
class MyVal
{
public:
    MyVal() {}

    MyVal(T v)
    {
        encode(v);
    }

    operator T ()
    {
        return decode();
    }

    operator const T () const
    {
        return decode();
    }

    MyVal<T>& operator=(T& v)
    {
        encode(v);
        return *this;
    }
}

我有

MyVal<int> some;

它在大多数情况下都可以正常工作,但如果我运行 printf("%d", some),它不会调用任何 T(),因此它不会给我解码后的值。

有什么方法可以在不更改 MyVal 类的任何代码的情况下使 printf 工作?

【问题讨论】:

  • 这不是你在 C++ 中做 IO 的方式。查找 C++ 流运算符。 cprogramming.com/tutorial/c++-iostreams.html
  • 不,这是不可能的。采用... 的函数不会对除默认参数提升之外的参数执行任何转换。在现代 C++ 中,避免在参数列表中使用带有 ... 的函数(带有模板参数包的函数除外!)
  • 使用 Boost 格式获得类似 printf 的体验,并具有良好的 C++ 支持。

标签: c++ templates printf encode


【解决方案1】:

printf 假定您,程序员,负责传递正确的参数类型。由于您要承担此责任,因此您不能依赖自动转换

您必须手动将变量转换为正确的类型。

printf("%d", int(some));

【讨论】:

  • 我几乎纠正了自己使用“C 风格演员表”,直到我了解全局...
  • 即使放眼全局,some.operator const int() 也能避免意外缩小转换,例如 long -> shortdouble -> int 等。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-15
  • 2013-04-21
相关资源
最近更新 更多