为什么static_cast不能从虚拟基地垂头丧气?
struct A {};
struct B : public virtual A {};
struct C : public virtual A {};
struct D : public B, public C {};
int main()
{
D d;
A& a = d;
D* p = static_cast<D*>(&a); //error
}
Run Code Online (Sandbox Code Playgroud)
g ++ 4.5说:
error: cannot convert from base ‘A’ to derived type ‘D’ via virtual base ‘A’
Run Code Online (Sandbox Code Playgroud)
解决方案是使用dynamic_cast?但为什么.什么是理性?
- 编辑 -
下面非常好的答案.没有答案详细说明子对象和vtable最终如何订购.以下文章为gcc提供了一些很好的例子:http:
//www.phpcompiler.org/articles/virtualinheritance.html#Downcasting
我收到一个迭代器作为参数,我想迭代两次值.
public void reduce(Pair<String,String> key, Iterator<IntWritable> values,
Context context)
Run Code Online (Sandbox Code Playgroud)
可能吗 ?怎么样 ?签名是由我正在使用的框架(即Hadoop)强加的.
- 编辑 -
最后方法的真实签名reduce是iterable.我被这个wiki页面误导了(这实际上是我发现的wordcount的唯一非弃用(但错误的)示例).
我有一个返回char数组的函数,我希望它变成一个String,这样我就可以更好地处理它(与其他存储数据相比).我使用这个简单的应该工作,但它不是出于某种原因(bufferPos是数组的长度,buffer是数组,item是一个空字符串):
for(int k=0; k<bufferPos; k++){
item += buffer[k];
}
Run Code Online (Sandbox Code Playgroud)
在buffer有正确的价值观也是如此bufferPos,但是当我尝试转换,例如544900010837154,它仅持有54如果我添加Serial.prints到像这样:
for(int k=0; k<bufferPos; k++){
Serial.print(buffer[k]);
Serial.print("\t");
Serial.println(item);
item += buffer[k];
}
Run Code Online (Sandbox Code Playgroud)
输出是这样的:
5
4 5
4 54
9 54
0 54
0 54
0 54
1 54
0 54
8 54
3 54
7 54
1 54
Run Code Online (Sandbox Code Playgroud)
我错过了什么?感觉就像这么简单的任务,我没有看到解决方案......
我目前正致力于在非RTTI平台(Android)上集成使用大量RTTI内容的第三方软件包.基本上,我做了自己的RTTI实现,但我遇到了问题.
问题是很多类都有钻石继承问题,因为所有类派生自相同的基类(对象)..所以,如果我想从基类转发到派生类,我必须使用一个dynamic_cast - 但RTTI不可用!当没有dynamic_cast的虚拟继承时,如何将对象从父对象转换为子对象?
它看起来像这样:
class A
{
public:
virtual char* func() { return "A"; };
};
class B : public virtual A
{
public:
//virtual char* func() { return "B"; };
};
class C : public virtual A
{
public:
//virtual char* func() { return "C"; };
};
class D : public B, public C
{
public:
//virtual char* func() { return "D"; };
};
D d;
A* pa = static_cast<A*>(&d);
D* pd = static_cast<D*>(pa); // can't do that! …Run Code Online (Sandbox Code Playgroud) 我需要一个符合以下规范的拼写检查器:
我接过一看的hunspell:
我发现参数MAXDIFF的人,但似乎并没有像预期的那样工作.也许我用错了方法
文件t.aff:
MAXDIFF 1
Run Code Online (Sandbox Code Playgroud)
文件dico.dic:
5
rouge
vert
bleu
bleue
orange
Run Code Online (Sandbox Code Playgroud)
-
NHunspell.Hunspell h = new NHunspell.Hunspell("t.aff", "dico.dic");
List<string> s = h.Suggest("bleuue");
Run Code Online (Sandbox Code Playgroud)
返回相同的东西t.aff是否为空:
bleue
bleu
Run Code Online (Sandbox Code Playgroud) 这是C++中一个简单的双容器zip函数:
template <typename A, typename B>
std::list<std::pair<A, B> > simple_zip(const std::list<A> & lhs,
const std::list<B> & rhs)
{
std::list<std::pair<A, B> > result;
for (std::pair<typename std::list<A>::const_iterator,
typename std::list<B>::const_iterator> iter
=
std::pair<typename std::list<A>::const_iterator,
typename std::list<B>::const_iterator>(lhs.cbegin(),
rhs.cbegin());
iter.first != lhs.end() && iter.second != rhs.end();
++iter.first, ++iter.second)
{
result.push_back( std::pair<A, B>(*iter.first, *iter.second) );
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
如何将此扩展到具有可变参数模板的任意数量的容器?
我想general_zip接受tuple的listS(每个列表可以包含不同类型的),并返回list的tuple秒.
我想列出存储库中每个文件的每个贡献者.
这是我现在所做的:
find . | xargs -L 1 git blame -f | cut -d' ' -f 2-4 | sort | uniq
Run Code Online (Sandbox Code Playgroud)
这很慢.有更好的解决方案吗?
守则如下:
#include <iostream>
using namespace std;
class Animal{
int a;
public:
Animal(int a) : a(a){}
int geta(){return a;}
};
class Bird : virtual public Animal{
string b;
public:
Bird(int a , string b) : Animal(a) , b(b){}
};
class Fish : virtual public Animal{
int f;
public:
Fish(int a , int f) : Animal(a) , f(f){}
};
class Unknown : public Bird, public Fish{
char u;
public:
Unknown(int a , int f , string b , char u …Run Code Online (Sandbox Code Playgroud) 所以,我读这提振文档,但我仍然不知道怎样做这样简单的事
int main() {
//stuff
startTimer();
// do stuff
int i =getTimerValue();
//stuff
}
Run Code Online (Sandbox Code Playgroud)
所以要获得我已经完成的东西的执行时间.怎么办这样的事情?