在Objective-C中,我可以测试给定的类或实例是否响应某些选择器.但是如何查询类或实例的所有方法或类的属性(例如所有方法或属性的列表)?
你们使用哪些工具?demangle c ++符号如何能够将它传递给探查器工具,例如opannotate?
谢谢
在C++中不可能声明静态虚函数,也不能将非静态函数强制转换为C样式函数指针.
现在,我有一个简单的ol'C SDK,它大量使用函数指针.
我必须用几个函数指针填充一个结构.我计划使用一个带有一堆静态纯虚方法的抽象类,并在派生类中重新定义它们并用它们填充结构.直到那时我才意识到在C++中不允许使用静态虚拟.
此C SDKs函数签名也没有userData参数.
有什么好的选择吗?我能想到的最好的方法是在每个派生类中定义一些纯虚方法GetFuncA(),GetFuncB(),...和一些静态成员FuncA()/ FuncB(),它们将由GetFuncX()返回.然后抽象类中的函数将调用这些函数来获取指针并填充结构.
编辑 回答John Dibling,能够做到这一点真是太好了:
class Base
{
FillPointers() { myStruct.funA = myFunA; myStruct.funB = myFunB; ...}
private:
CStruct myStruct;
static virtual myFunA(...) = 0;
static virtual myFunB(...) = 0;
};
class Derived1 : public Base
{
Derived1() { FillPointers(); }
static virtual myFunA(...) {...};
static virtual myFunB(...) {...};
};
class Derived2 : public Base
{
Derived2() { FillPointers(); }
static virtual myFunA(...) {...};
static virtual myFunB(...) {...};
};
int main()
{
Derived1 d1; …Run Code Online (Sandbox Code Playgroud) 以下按预期工作:
d = [(1,2), (3,4)]
for k,v in d:
print "%s - %s" % (str(k), str(v))
Run Code Online (Sandbox Code Playgroud)
但这失败了:
d = collections.defaultdict(int)
d[1] = 2
d[3] = 4
for k,v in d:
print "%s - %s" % (str(k), str(v))
Run Code Online (Sandbox Code Playgroud)
附:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'int' object is not iterable
Run Code Online (Sandbox Code Playgroud)
为什么?我该如何解决?
我很好奇为Chrome,Safari和Opera等浏览器编写浏览器插件的过程.我在这里特别考虑Windows,并且更喜欢使用C++.
是否有任何工具或教程详细说明了这个过程?
注意:我不是指扩展名或"插件".我指的是类似于Flash和Adobe Reader如何使用插件来处理特定内容类型的插件.
在纯C++世界中,我们可以在编译时使用基于模板的编译时和运行时技术的组合在不同组件或接口之间生成接口或粘合代码(例如,大多数自动编组到使用传统类型的调用).
当必须使用Objective-C/Cocoa将C++应用程序与GUI,系统集成或IPC接口时,由于不太严格的类型,事情变得更加困难 - 但通常不需要更多的平面复制接口层:瘦桥接代表必须是必须编写定义或转换代码到语言桥接调用.
如果你必须处理非平凡大小的接口并希望避免基于脚本的代码生成,这很快变得麻烦,并且每次重构都必须发生时只是痛苦.使用(模板)元编程和Objective-C运行时库的组合,应该可以大大减少代码量...
在我重新发明轮子之前(可能浪费时间),有没有人知道这方面的技术,最佳实践或例子?
举个例子,假设我们需要一个支持这种非正式协议的委托:
- (NSString*)concatString:(NSString*)s1 withString:(NSString*)s2;
- (NSNumber*) indexOf:(CustomClass*)obj;
Run Code Online (Sandbox Code Playgroud)
现在,我没有实现明确桥接到C++实例的Obj-C类,而是想做类似的事情:
class CppObj {
ObjcDelegate m_del;
public:
CppObj() : m_del(this)
{
m_del.addHandler
<NSString* (NSString*, NSString*)>
("concatString", &CppObj::concat);
m_del.addHandler
<NSNumber* (CustomClass*)>
("indexOf", &CppObj::indexOf);
}
std::string concat(const std::string& s1, const std::string& s2) {
return s1.append(s2);
}
size_t indexOf(const ConvertedCustomClass& obj) {
return 42;
}
};
Run Code Online (Sandbox Code Playgroud)
用户需要支持其他类型的所有内容都是专门化转换模板功能:
template<class To, class From> To convert(const From&);
template<>
NSString* convert<NSString*, std::string>(const std::string& s) {
// ...
} …Run Code Online (Sandbox Code Playgroud) 析构函数(当然还有构造函数)与其他成员函数之间的区别在于,如果常规成员函数在派生类中具有主体,则只会执行Derived类中的版本.在析构函数的情况下,派生以及基类版本都会被执行吗?
很容易知道在析构函数(可能是虚拟的)和构造函数的情况下究竟发生了什么,即使删除了最多派生的类对象,也会为它们的所有基类调用它们.
提前致谢!
我可以使用按位运算符检查数字是否为奇数/偶数.我可以在不使用任何条件语句/运算符(如if/ternary等)的情况下检查数字是正数还是零/负数.
可以使用按位运算符和C或C++中的一些技巧来完成相同的操作吗?
使用SFINAE,我可以检测给定的类是否具有某个成员函数.但是如果我想测试继承的成员函数呢?
以下在VC8和GCC4中不起作用(即检测到A具有成员函数foo(),但不会B继承成员函数):
#include <iostream>
template<typename T, typename Sig>
struct has_foo {
template <typename U, U> struct type_check;
template <typename V> static char (& chk(type_check<Sig, &V::foo>*))[1];
template <typename > static char (& chk(...))[2];
static bool const value = (sizeof(chk<T>(0)) == 1);
};
struct A {
void foo();
};
struct B : A {};
int main()
{
using namespace std;
cout << boolalpha << has_foo<A, void (A::*)()>::value << endl; // true
cout << boolalpha …Run Code Online (Sandbox Code Playgroud) 我想要一个.csv列表,mysql数据库或所有美国州和城市的任何其他列表,包括哪个城市在哪个州.从这个列表中我将生成一个包含以下字段的mysql数据库:
states:
- id (int, auto_increment, primary)
- name (varchar 255)
cities:
- id (int, auto_increment, primary)
- stateId (id of the state from states table to which this city belongs)
- name (varchar 255)
Run Code Online (Sandbox Code Playgroud)
提前致谢.
c++ ×7
c ×2
objective-c ×2
algorithm ×1
cocoa ×1
database ×1
destructor ×1
dictionary ×1
inheritance ×1
iterator ×1
npapi ×1
performance ×1
profiling ×1
python ×1
sfinae ×1
static ×1
templates ×1
virtual ×1