我发现两个编译器(g ++ 4.5,VS2010 RC)之间存在一些不一致的方式,它们将lambdas与类模板的部分特化相匹配.我试图为lambdas实现类似boost :: function_types的东西以提取类型特征.请查看此内容以获取更多详
在g ++ 4.5中,operator()lambda 的类型看起来像一个独立函数(R(*)(...)),而在VS2010 RC中,它看起来像一个成员函数(R( C::*)(...)).所以问题是编译器编写者可以自由地解释他们想要的任何方式吗?如果没有,哪个编译器是正确的?请参阅以下详细信息.
template <typename T>
struct function_traits
: function_traits<decltype(&T::operator())>
{
// This generic template is instantiated on both the compilers as expected.
};
template <typename R, typename C>
struct function_traits<R (C::*)() const> { // inherits from this one on VS2010 RC
typedef R result_type;
};
template <typename R>
struct function_traits<R (*)()> { // inherits from this one on g++ 4.5
typedef R result_type;
};
int main(void) …Run Code Online (Sandbox Code Playgroud) AFAIK,C++ 11/14在定义lambda时不允许就地定义新的返回类型.但是,似乎C++ 14 lambda捕获表达式实际上创建了一个带有一个或多个"成员"和一个operator()的匿名类型.那么,为什么编译器不允许从lambda 外部访问捕获的成员.我的软弱无法处理C++的复杂性,但它听起来像是一种合理的语言扩展吗?这是一个例子.
vector<string> words = { "Stack", "Overflow" };
auto l = [w = words](){}; // almost like a C# anonymous type
cout << l.w[0]; // does not work.
Run Code Online (Sandbox Code Playgroud) 以下是我在各种编译器中观察到的内容.似乎有编译器错误.
template <int I>
struct X
{ };
int main(void)
{
X<(16 > 1)> a; // Works on vc9, works on g++ 4.1.2, works on Comeau 4.3.10.1
X<(int(16) > 1)> b; // Works on vc9, works on g++ 4.1.2, works on Comeau 4.3.10.1
X<(16 >> 1)> c; // Works on vc9, works on g++ 4.1.2, works on Comeau 4.3.10.1
X<(int(16) >> 1)> d; // Fails on vc9, works on g++ 4.1.2, works on Comeau 4.3.10.1
X<16 > 1> e; // …Run Code Online (Sandbox Code Playgroud) 没有例子,这个问题几乎没有意义.所以这就是我想要做的.
通常,C++允许以下内容:
template<class T, class U, T t, U u>
void func() {}
func<char, int, 'A', 10>();
Run Code Online (Sandbox Code Playgroud)
但似乎它的自然变量扩展不起作用.
template<class...T, T... t>
void func() {}
func<char, int, 'A', 10>();
Run Code Online (Sandbox Code Playgroud)
clang和g ++ 4.7都拒绝上述代码.实例化完成后会显示错误.在我看来,应该明确地解析两个可变列表,因为第一个具有类型而另一个仅具有整数值.
如果上述内容无效,我认为以下内容也不起作用.
template <class Ret, class... Args, Ret (*func)(Args...)>
class Foo {};
Run Code Online (Sandbox Code Playgroud)
我认为Foo模板是一个非常有用的东西.
我想知道C++ 0x是否提供了任何内置功能来检查可变参数模板的参数包是否包含特定类型.今天,如果你使用boost :: mpl :: vector作为variadic模板的替代品,可以用boost ::: mpl :: contains来实现这个目的.但是,它有严重的编译时间开销.我想,C++ 0x对std :: is_same有编译器级支持.所以我在想是否在编译器中也支持如下的泛化.
template <typename... Args, typename What>
struct is_present
{
enum { value = (What in Args...)? 1 : 0 };
};
Run Code Online (Sandbox Code Playgroud) 我试图理解如何实现unique_ptr的C++ 03仿真.unique_ptr非常像std :: auto_ptr但更安全.在auto_ptr隐式转移所有权(即静默)的情况下,它会吐出编译器错误.例如,一个简单的任务.功能move是模拟unique_ptr安全性的关键.
问题:
接受引用并将其转换为右值的第三个移动函数实现(简化)如下.
T move(T &t) {
return T(detail_unique_ptr::rv<T>(t));
}
Run Code Online (Sandbox Code Playgroud)在上面的代码中,显式转换为T似乎是不必要的.实际上,Visual Studio 2010非常高兴,没有明确转换为T.
T move(T &t) {
return detail_unique_ptr::rv<T>(t);
}
Run Code Online (Sandbox Code Playgroud)
然而,g ++,clang,Comeau不喜欢第二个版本.这些编译器抱怨说,有没有构造函数unique_ptr<T>这需要detail_unique_ptr::rv<T>作为一个参数.这是为什么?unique_ptr已经定义了一个(非显式)构造函数,它detail_unique_ptr::rv<T>作为参数.为什么不自动拾取?
AFAIK,boost :: compressed_pair应该确保第一个和第二个memebrs的地址是不同的,同时它可以实现压缩该对的魔力.它在这里说.看起来并非如此,并且它的行为在不同的编译器上是不同的.我正在使用boost v 1.47.我错过了什么?
struct E1 {};
struct E2 {};
boost::compressed_pair<E1, E2> diff_pair;
boost::compressed_pair<E1, E1> same_pair;
// clang++ and g++ 4.7 print the same address but VC2010 prints different addresses.
printf("different pairs = %p, %p\n", &diff_pair.first(), &diff_pair.second());
// clang++ and g++ 4.7 print different addresses but VC2010 prints the same address.
printf("different pairs = %p, %p\n", &same_pair.first(), &same_pair.second());
Run Code Online (Sandbox Code Playgroud) 我需要读取一个大型 XML (65 Mb),根据 xsd 对其进行验证,然后对其运行 XPath 查询。下面,我给出了一个 lxml 版本。运行查询需要很多时间(超过 5 分钟),但验证似乎非常快。
我有几个问题。一个注重性能的 Python 程序员如何使用 lxml 编写程序?其次,如果 lxml 不适合这份工作,还有什么?你能给出一个代码片段吗?
import sys
from datetime import datetime
from lxml import etree
start = datetime.now()
schema_file = open("library.xsd")
schema = etree.XMLSchema(file=schema_file)
parser = etree.XMLParser(schema = schema)
data_file = open(sys.argv[1], 'r')
tree = etree.parse(data_file, parser)
root = tree.getroot()
data_file.close()
schema_file.close()
end = datetime.now()
delta = end-start
print "Parsing time = ", delta
start = datetime.now()
name_list = root.xpath("book/author/name/text()")
print ("Size of list = " …Run Code Online (Sandbox Code Playgroud) struct A {
int a;
virtual void print() {}
};
struct B : A {
int b;
virtual void print() {}
};
int main(void)
{
A *a = new B;
a[0].print(); // g++, vs2010, clang call B::print.
}
Run Code Online (Sandbox Code Playgroud)
所有三个g ++,vs2010,clang调用B :: print.几乎怀疑我的C++ 101.我的印象是使用带有对象的点不会导致动态调度.只有 - >带指针和带引号的点将导致动态调度.
所以我的问题是这段代码是否可移植?
为什么单个参数构造函数std::list<T>需要T是一个默认可构造类型?我的意思是以下代码无法编译.
struct Foo { // does not have default constructor.
Foo (int i) {}
}
int main(void) {
std::list<Foo> l(10);
}
Run Code Online (Sandbox Code Playgroud)
似乎可以使用构造并销毁习惯用法,因为它们已经在std :: vector中完成了,尽管有更多的书籍保持列表类.
在相关的说明中,为什么没有列表中的容量功能?您可以争辩说,这样的函数会预先支付内存分配成本,并在您push_back反对时消除开销.至少它会使两个STL序列容器的接口稍微更一致.