小编Kon*_*lph的帖子

将临时绑定到非const引用

合理

我会尽量避免在C++代码分配完全.也就是说,我只使用初始化并const尽可能地声明局部变量(即总是除了循环变量或累加器之外).

现在,我发现了一个不起作用的情况.我认为这是一般模式,但特别是在以下情况下出现:

问题描述

假设我有一个程序将输入文件的内容加载到字符串中.您可以通过提供文件名(tool filename)或使用标准输入流(cat filename | tool)来调用该工具.现在,我如何初始化字符串?

以下不起作用:

bool const use_stdin = argc == 1;
std::string const input = slurp(use_stdin ? static_cast<std::istream&>(std::cin)
                                          : std::ifstream(argv[1]));
Run Code Online (Sandbox Code Playgroud)

为什么这不起作用?因为原型slurp需要看起来如下:

std::string slurp(std::istream&);
Run Code Online (Sandbox Code Playgroud)

也就是说,我的论证是非 - const因此我不能将它绑定到临时的.似乎没有办法使用单独的变量.

丑陋的解决方法

目前,我使用以下解决方案:

std::string input;
if (use_stdin)
    input = slurp(std::cin);
else {
    std::ifstream in(argv[1]);
    input = slurp(in);
}
Run Code Online (Sandbox Code Playgroud)

但这是以错误的方式揉搓我.首先,它是更多的代码(在SLOC中),但它也使用一个if而不是(这里)更逻辑的条件表达式,并且它在声明后使用我想要避免的赋值.

是否有一种避免这种间接初始化方式的好方法?这个问题可能会推广到需要改变临时对象的所有情况.难道流不是设计得不好以应对这种情况(const流没有意义,但是在临时流上工作确实有意义)?

c++ const temporary

16
推荐指数
2
解决办法
1393
查看次数

如何出口适当的TSV?

简短而甜蜜:如何从R导出TSV/CSV?

write.table/ write.csv 几乎有效:

test <- data.frame(a = 2 : 4, b = 3 : 5)
write.table(test, file='test.tsv', quote=FALSE, sep='\t')
Run Code Online (Sandbox Code Playgroud)
$ more test.tsv
a   b
1   2   3
2   3   4
3   4   5
Run Code Online (Sandbox Code Playgroud)

...但产生的格式与大多数其他程序的格式不同:

    a   b
1   2   3
2   3   4
3   4   5
Run Code Online (Sandbox Code Playgroud)

- 注意标题行的不同处理方式.

如何导出第二种格式而不是第一种格式?手动指定col.namesas c('', colnames(test))不起作用 - R抱怨无效的参数.

r tsv

16
推荐指数
1
解决办法
2万
查看次数

带有Regex的CSS2属性选择器

CSS属性选择器允许基于属性值选择元素.不幸的是,我多年没有使用它们(主要是因为它们不受所有现代浏览器的支持).但是,我清楚地记得,通过使用类似于以下的代码,我能够使用它们来装饰带有图标的所有外部链接:

a[href=http] {
    background: url(external-uri);
    padding-left: 12px;
}
Run Code Online (Sandbox Code Playgroud)

上面的代码不起作用.我的问题是:如何工作的?如何选择属性以?开头的所有<a>标签?官方CSS规范(上面链接)甚至没有提到这是可能的.但我确实记得这样做.href"http"

(注意:显而易见的解决方案是使用class属性进行区分.我想避免这种情况,因为我对HTML代码的构建方式几乎没有影响.我可以编辑的只是CSS代码.)

css css-selectors

15
推荐指数
2
解决办法
2万
查看次数

修改现有的.NET程序集

有没有办法修改现有的.NET程序集而不诉诸第三方工具?我知道PostSharp使这成为可能,但我发现PostSharp的开发人员基本上必须重写整个System.Reflection命名空间的功能以使现有的程序集可修改,这令人难以置信地浪费.

System.Reflection.Emit只允许创建新的动态程序集.但是,此处使用的所有构建器类都继承自基本反射类(例如,TypeBuilder继承自System.Type).不幸的是,似乎没有办法将现有的动态加载类型强制转换为类型构建器.至少,没有正式的,受支持的方式.

那么不支持呢?有没有人知道允许将现有程序集或类型加载到此类构建器类中的后门程序?

记住,我不是在寻找修改当前程序集的方法(这可能是一个不合理的请求),而只是修改从光盘加载的现有程序集.我担心没有这样的事情,但无论如何我还是想问.

在最坏的情况下,人们不得不求助于ildasm.exe反汇编代码然后ilasm.exe重新组装,但是.NET中没有工具链(读取:IL读取器)来处理IL数据(或者在那里?).

/编辑:

我没有具体的用例.我只是对通用解决方案感兴趣,因为修补现有的程序集是一项非常常见的任务.以混淆器为例,或者分析器或AOP库(是的,后者可以以不同的方式实现).正如我所说,被迫重写现有基础设施的大部分内容似乎非常浪费System.Reflection.


@楔:

你是对的.但是,这里没有具体的用例.我修改了原始问题以反映这一点.我的兴趣是由另一个问题引发的,其中提问者想要知道如何注入指令pop以及ret在每种方法的最后,以便让Lutz Roeder的Reflector不再重新设计(VB或C#)源代码.

现在,这个场景可以通过许多工具实现,例如上面提到的PostSharp和Reflector 的Reflexil插件,而这些工具又使用Cecil库.

总而言之,我对.NET框架不满意.

@Joel:

是的,我知道这个限制.无论如何,谢谢你指出它,因为它很重要.

@marxidad:

这似乎是唯一可行的方法.但是,这意味着您仍然需要使用构建器类重新创建完整的程序集,对吧?也就是说,你必须手动遍历整个组件.

嗯,我会调查一下.

.net reflection cil assemblies reflection.emit

15
推荐指数
2
解决办法
9246
查看次数

Matplotlib PDF导出使用错误的字体

我想为演示文稿生成高质量的图表.我正在使用Python的matplotlib来生成图形.不幸的是,PDF导出似乎忽略了我的字体设置.

我尝试通过将FontProperties对象传递给文本绘图函数并通过全局设置选项来设置字体.为了记录,这里有一个重现问题的MWE:

import scipy
import matplotlib
matplotlib.use('cairo')
import matplotlib.pylab as pylab
import matplotlib.font_manager as fm

data = scipy.arange(5)

for font in ['Helvetica', 'Gill Sans']:
    fig = pylab.figure()
    ax = fig.add_subplot(111)
    ax.bar(data, data)
    ax.set_xticks(data)
    ax.set_xticklabels(data, fontproperties = fm.FontProperties(family = font))
    pylab.savefig('foo-%s.pdf' % font)
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,生成的输出都是相同的并使用Helvetica(是的,我确实安装了两种字体).

只是为了确定,以下内容也无济于事:

matplotlib.rc('font', family = 'Gill Sans')
Run Code Online (Sandbox Code Playgroud)

最后,如果我替换后端,而是使用本机查看器:

matplotlib.use('MacOSX')
Run Code Online (Sandbox Code Playgroud)

确实显示了正确的字体 - 但仅限于查看器GUI.PDF输出再次出错.

可以肯定 - 我可以设置其他字体 - 但只能设置其他类型的字体系列:我可以设置serif字体或fantasymonospace.但是所有sans-serif字体似乎都默认为Helvetica.

python macos matplotlib cairo

14
推荐指数
2
解决办法
7201
查看次数

特征类的typedef中的匿名结构

抱歉有趣的标题.

在此之前的C++ 0x,有限制的使用功能局部结构("本地型")作为模板参数.我的问题基本上是否类似的限制适用于匿名结构.具体来说,在特质类的上下文中:

template <typename T>
struct trait;

template <>
struct trait<int> {
    typedef int type;
};

template <typename T>
struct trait<std::basic_string<T> > {
    typedef struct {
        T value;
    } type;
};

trait<std::string>::type foo; // Is this valid?

template <typename T>
void f() { }

f<trait<std::string>::type> >(); // Is this?

template <typename T>
void g() { f<typename trait<T>::type>(); }

g<std::string>(); // And this?
Run Code Online (Sandbox Code Playgroud)

这有效可靠吗?它汇编了最新版本的GCC和LLVM,但我仍然不安全,这是否严格有效,以及VC++和ICC是否理解它.

c++ templates anonymous-class c++11

14
推荐指数
2
解决办法
984
查看次数

C回调函数模板:显式实例化模板

前提

我正在使用C库(来自C++),它提供以下接口:

void register_callback(void* f, void* data);
void invoke_callback();
Run Code Online (Sandbox Code Playgroud)

问题

现在,我需要注册一个函数模板作为回调,这导致我的问题.请考虑以下代码:

template <typename T> void my_callback(void* data) { … }

int main() {
    int ft = 42;
    register_callback(reinterpret_cast<void*>(&my_callback<int>), &ft);
    invoke_callback();
}
Run Code Online (Sandbox Code Playgroud)

这给了我以下链接器错误(在OS X上使用g ++(GCC)4.5.1,但适用于编译器版本/平台的大多数其他组合):

架构x86_64的未定义符号:

"void my_callback<int>(void*)", referenced from:  
  _main in ccYLXc5w.o
Run Code Online (Sandbox Code Playgroud)

我觉得这是可以理解的.

首个"解决方案"

通过显式实例化模板可以轻松解决此问题:

template void my_callback<int>(void* data);
Run Code Online (Sandbox Code Playgroud)

不幸的是,这不适用于我的真实代码,因为回调是函数模板中注册的,我不知道这个函数将被调用哪个模板参数集,因此我不能为所有的函数提供显式实例化.他们(我正在编写一个图书馆).所以我的真实代码看起来有点像这样:

template <typename T>
void do_register_callback(T& value) {
    register_callback(reinterpret_cast<void*>(my_callback<T>), &value);
    // Other things …
}

int main() {
    int ft = 42;
    do_register_callback(ft);
    invoke_callback();
}
Run Code Online (Sandbox Code Playgroud)

第二"解决方案"

通过调用函数隐式实例化函数模板.所以我们这样做,但要确保调用没有实际执行(该函数有副作用): …

c++ macos templates undefined-reference gcc4

14
推荐指数
3
解决办法
2705
查看次数

图标签中的表达式和新行

我想在我的图表标签上添加一些下标和上标.我试过了expression,但它没有按照我希望的新行(\n)工作.我尝试使用paste它来修复它,但它不起作用.以下是我的一些尝试:

par(mfcol=c(1,3))
plot(1,1,main=expression("first line \n second line x"^2))
plot(1,1,main=expression(paste("first line \n second line", "x"^2)))
plot(1,1,main=paste("first line \n second line", expression("x"^2)))
Run Code Online (Sandbox Code Playgroud)

它产生:

在此输入图像描述

在前两张图片中,第二行没有很好地居中,在第三行中,上标失败.如何获得中心线和下标/上标?

plot expression newline r

14
推荐指数
2
解决办法
2万
查看次数

随机大写字母串中的字母

我想随机大写或小写字符串中的每个字母.我是新手在python中使用字符串,但我认为因为字符串是不可变的,所以我不能执行以下操作:

i =0             
for c in sentence:
    case = random.randint(0,1)
    print("case = ", case)
    if case == 0:
        print("here0")
        sentence[i] = sentence[i].lower()
    else:
        print("here1")
        sentence[i] = sentence[i].upper()
    i += 1
print ("new sentence = ", sentence)
Run Code Online (Sandbox Code Playgroud)

并得到错误:TypeError:'str'对象不支持项目分配

但那么我怎么能这样做呢?

python lowercase python-3.x uppercase

14
推荐指数
2
解决办法
1709
查看次数

强制使用“var”被解析为关键字而不是类名

是否可以强制 C# 编译器在声明名称时将其var视为关键字而不是类标识符var

public class var
{
}

public class A
{
}

public class Program
{
    public static void Main()
    {
        var a=new A{};  // Cannot implicitly convert type 'A' to 'var'
    }
}
Run Code Online (Sandbox Code Playgroud)

https://dotnetfiddle.net/O1wVoO

c#

14
推荐指数
1
解决办法
350
查看次数