- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在实现 stream insertion operator对于我的一个类。我希望我的类(class)能够同时使用窄流和宽流。我正在使用一个模板来允许这种行为——除了字 rune 字之外,一切都与实际使用的流类型无关。如果它是一个宽字符串,则字 rune 字需要在文字前面加上 L
,否则不需要。
有没有办法将这种东西键入模板参数,这样我就不需要在上面复制这么多代码?
(如果可能,我宁愿避免在运行时执行窄到宽字符或宽到窄字符转换。)
我目前拥有的示例——它是一个模板,但由于宽字 rune 字,它不适用于窄字符流:
template <typename charT, typename traits>
std::basic_ostream<charT, traits>& operator<<(
std::basic_ostream<charT, traits>& lhs,
const Process& rhs
)
{
lhs << L"Process (0x" << std::setw(8) << std::hex
<< std::setfill(L'0') << rhs.GetId() << L") ";
lhs << rhs.GetName() << std::endl;
lhs << L"Command Line: " << rhs.GetCmdLine() << std::endl;
const std::vector<Thread>& threads = rhs.GetThreads();
for (std::vector<Thread>::const_iterator it = threads.begin();
it != threads.end(); ++it)
{
lhs << L" --> " << *it << std::endl;
}
const std::map<void *, Module>& modules = rhs.GetModules();
for (std::map<void *, Module>::const_iterator it = modules.begin();
it != modules.end(); ++it)
{
lhs << L" --> " << it->second << std::endl;
}
return lhs;
}
最佳答案
如果您不想要运行时开销,我认为尽管丑陋,宏在这种情况下可以为您提供帮助。
template <typename T>
inline const T* select(const char* narrow, const wchar_t* wide);
template <>
inline const char* select<char>(const char* narrow, const wchar_t* /*wide*/)
{
return narrow;
}
template <>
inline const wchar_t* select<wchar_t>(const char* /*narrow*/, const wchar_t* wide)
{
return wide;
}
#define doselect(T, str) select<T>(str, L ## str)
template <typename charT, typename traits>
std::basic_ostream<charT, traits>& operator<<(
std::basic_ostream<charT, traits>& lhs,
const Process& rhs
)
{
lhs << doselect(charT, "Process (0x") << std::setw(8) << std::hex
<< std::setfill(charT('0')) << rhs.GetId() << doselect(charT, ") ");
lhs << rhs.GetName() << std::endl;
lhs << doselect(charT, "Command Line: ") << rhs.GetCmdLine() << std::endl;
const std::vector<Thread>& threads = rhs.GetThreads();
for (std::vector<Thread>::const_iterator it = threads.begin();
it != threads.end(); ++it)
{
lhs << doselect(charT, " --> ") << *it << std::endl;
}
const std::map<void *, Module>& modules = rhs.GetModules();
for (std::map<void *, Module>::const_iterator it = modules.begin();
it != modules.end(); ++it)
{
lhs << doselect(charT, " --> ") << it->second << std::endl;
}
return lhs;
}
您可以使用另一个不错的宏来扩展doselect
,以进一步减少代码重复。即 doselect2("--> ")
会自动扩展为 doselect(charT, "--> ")
。
关于c++ - 如何为一般情况编写流插入运算符? (也就是说,对于 `char` 和 `wchar_t` 流?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4548826/
我正在尝试删除单元格中的颜色,但不删除单元格中的数据。我尝试过这两种方法: Sheets("Output").Range("B3:ka200").Clear Sheets("Output").Rang
我读过几篇关于从数字数组中选择元素的更高概率和钟形曲线的文章,但是我有一个字符串数组我想从中选择。我的网站上有一堆 DIV,我想从一组 6 种颜色中随机着色: var colors = new Arr
import java.util.Arrays; public class temp_2 { public static void intersection(int[] arr1, int[]
我需要一个非常快速(插入、删除、包含)的高度并发 列表,它可以使用比较器/可比较对象进行排序。 现有的 ConcurrentSkipListSet 将是理想的,如果它是一个列表而不是一个集合。我需要将
我正在 Eclipse(加上 Tigris)中启动一个小项目,我想在其上尝试 Subversion。我在网上没有任何存储库。 我是否需要在网络上拥有一个存储库才能使用源代码管理?根据我的观察,Ecli
我想向 JavaFX 的虚拟键盘添加数字键盘。 我尝试了其他几种解决方案(包括使用 GitHub 上的键盘或尝试 JavaFX 的数字虚拟键盘),但这将是最简单、最实用的。 我找到了由 com.sun
在我的 iced-coffee-script 测试中,我想检查某些内容是否低于预期。我为此找到的唯一库是 assertthat : assert = require 'node-assertthat'
多年来,我在 Heroku 上创建(并放弃)了一些应用程序,当它们被推送到 Heroku 的服务器时,Heroku 会自动为它们分配通用但富有诗意的名称。现在,当我登录到我的 Heroku 帐户时,那
我目前正在使用代码块在 c 中编写一堆计算,并使用 printf(); 将它们打印到 cmd 提示符下;功能。我正在尝试根据收集的数据创建图表。有没有办法获取我打印出的所有数据的硬拷贝或文本/doc
我目前有一个“类库”.c 文件(如下所示)。我对此有 2 个问题: 如果我想看看它自己是否编译良好,我该怎么做?如果我尝试对它进行 gcc,它总是会给出“no main”错误,这是有道理的,但会引发一
假设我们从应用的角度有以下需求: SuperClass 有一些属性,如 Type、PropertyA、PropertyB 等。 SubClassA、SubClassB、SubClassC都继承了这些属
我正在实现 stream insertion operator对于我的一个类。我希望我的类(class)能够同时使用窄流和宽流。我正在使用一个模板来允许这种行为——除了字 rune 字之外,一切都与实
在阅读 C++11 中的 SCARY 迭代器时,I see : From a compiler perspective there is nothing wrong here. From a prac
官方W3C documentation说: 1 px = 1/96th of 1 in 在我之前的 18.5 英寸屏幕中,screen.width 是 1367 px 并且以英寸为单位的屏幕宽度是 1
//, 这个问题有点模棱两可。 场景如下: 我有以下三个扩展名的日志,但我当前的规则仅适用于 *.log 文件: .1 .log .txt 另外,因为 Tomcat 正在轮换日志,所以我有以下内容:
我想知道 PHP 是否可以做到这一点,因为似乎还没有好的解决方案: p($i) 它会打印 $i is 5 和 p(1 + 2) 将打印 1 + 2 is 3 和 p($i * 2) => $i *
我正在尝试控制来自服务器的资源缓存,并且我已经验证将以下 header 放在我的 HTTP 响应上会导致浏览器按预期缓存资源。 Cache-Control: must-revalidate, max-
我是一名优秀的程序员,十分优秀!