这段代码有效吗?
int foo()
{
std::vector<std::string>& v = std::vector<std::string>(5, "X");
// Do something silly...
return 42;
}
Run Code Online (Sandbox Code Playgroud)
出于某种原因,我认为临时std::vector对象(从赋值标记开始)应该在构造之后被破坏(从而使引用无效).
然而,调试证明我错了,而且,我意识到我不太明白为什么在函数返回时会破坏临时变量.
我想我对一些基本的东西有很强的误解,所以请赐教:)
假设我有一个众所周知的界面IWellKnownInterface,已知COM-visible并注册.
我也有一个托管(C#,确切地说)这个对象的实现:
public class MyWellKnownClass : IWellKnownInterface { ... }
Run Code Online (Sandbox Code Playgroud)
最后,我有一个extern方法,它接受这个接口的对象:
[Whatever]
private static extern void ExternMethod(IWellKnownInterface veryWellKnown);
Run Code Online (Sandbox Code Playgroud)
我想知道从以下代码下面发生了什么CLR:
IWellKnownInterface a = new MyWellKnownClass();
ExternMethod(a);
Run Code Online (Sandbox Code Playgroud)
我知道如果我们谈论从托管代码调用非托管COM对象,那就是构建一个合适的,Runtime Callable Wrapper并通过适当的参数转换委托调用.但是,当我们有一个托管的COM对象并且它被用在非托管代码中时,我找不到有关这种情况的任何信息.
dynamic类型如何影响CLR相同情况下的行为?它会以某种方式改变内部托管到非托管的互操作逻辑吗?也许为MyWellKnownClass实例添加一些额外的包装器?
dynamic a = new MyWellKnownClass();
ExternMethod(a);
Run Code Online (Sandbox Code Playgroud) 假设我有一个带有一组标记有[Import]属性的字段的类,其中所有这些字段都禁止重构.
在某个时刻,new MyClassWithInjectedFields(...)使用MEF框架实例化此类,并使用框架注入所有相应的依赖项- 没有严重的,只有双射Export-To-Import映射.
问题:
是否可以安全地假设在这种情况下,注入字段的值将保持不变,直到类实例被垃圾回收?
或者可能有一些罕见/模糊的情况,它们可能会
MEF在运行时隐式更改?也许,当有人卸载或重新加载用于依赖解析的程序集时?
(我是新手MEF,我不确定在运行时是否有影响依赖图的方法,但是,显然可能存在).
我对模板专业化略有困惑.
我有类Vector2,Vector3其中包含operator+=(以下面的方式定义).
Vector2& operator+=(const Vector2& v) {
x() += v.x(), y() += v.y();
return *this;
}
Run Code Online (Sandbox Code Playgroud)
现在我想添加泛型添加行为并说出如下内容:
template <typename V> const V operator+(const V& v1, const V& v2) {
return V(v1) += v2;
}
Run Code Online (Sandbox Code Playgroud)
这编译很好,适用于Vector2和Vector3.但是,假设我想为我做一个稍微高效的"+"操作,我Vector2希望它采用以下方式(使用模板特化):
template<> const Vector2 operator+(const Vector2& v1, const Vector2& v2) {
return Vector2(v1.x() + v2.x(), v1.y() + v2.y());
}
Run Code Online (Sandbox Code Playgroud)
这看起来很好,但遗憾的是,将这两个代码块放在一起使得代码无法编译
(链接器说错误LNK2005: "Vector2 const operator+<Vector2>(Vector2 const &,Vector2 const &)" (??$?HVVector2@core@lf@@@core@lf@@YA?BVVector2@01@ABV201@0@Z) already …
我正在寻找一些简单而有效的参数容器,它将像内存中的xml文件表示(或ini文件,作为另一个示例).
我的意思是,基本上它可以为每个部分存储部分和参数集,具有简单的访问器GetValue("ParameterName")和简单的返回值转换.
如果它是可序列化的将是很好的.
我昨天写了类似的东西,嗯,它适合我的需要,但可能有更方便和灵活的东西?
也许是某种参数图boost?
谢谢
我知道它boost::variant使用boost::mpl它背后的东西,并有一个mpl兼容的typedef types.
假设我有一个简单的typedef: typedef boost::variant<bool, int> Variant;
现在我有另一个模板功能,让我们说:
template <typename T> T function() {
// ...
}
Run Code Online (Sandbox Code Playgroud)
我希望这个函数在两种情况下采取不同的行动:当T一部分时Variant::types和不时时.
显然,我必须做点什么
template <typename T>
typename boost::enable_if<CONDITION, T>::type function() {
// Implementation for the case T is in Variant::types
}
template <typename T>
typename boost::disable_if<CONDITION, T>::type function() {
// Implementation for the case T is ***NOT*** in Variant::types
}
Run Code Online (Sandbox Code Playgroud)
我唯一不知道的是这个CONDITION.
现在 - 我认为如果T是其中的一部分,可以进行编译时查询Variant::types.
有人知道吗?
我有以下问题:
难道微软的Visual Studio (我使用的是2008 SP1)提供任何方法来覆盖非标准C函数,例如malloc,memcpy?
假设我有一些外部构建的库,其中包含malloc.obj和memcpy.obj.图书馆被称为library.lib.
我应该如何构建我的项目,以便编译器使用我的(覆盖)版本malloc()和memcpy()例程而不是提供的那些(我假设它们共享相同的语法)?
整个这个问题的关键在于改变malloc我的项目中的每一个而不使用类似my_malloc或类似的名称别名,这样我就可以比较性能.
这可能吗?
谢谢.
我想知道在C++中是否有可能以某种方式处理以下情况:
情况1) (易于处理)
class BasicFacility { }
template <typename U1, typename U2> class Facility : public BasicFacility { }
Run Code Online (Sandbox Code Playgroud)
现在假设我们想要一些编译时断言,我们想检查任意类型是否typename T建模Facility.这很简单:
(boost::is_base_of<BasicFacility, T>::type)
Run Code Online (Sandbox Code Playgroud)
情况2) (???)
现在让我们假设在相同的情况下我们只有模板类:
template <typename U1, typename U2> class Facility { }
Run Code Online (Sandbox Code Playgroud)
显然我们不能从情境一中使用相同的解决方案,因为我们不能写statement<Facility, T>(Facility模板本身).
那么,有没有一种方法(可能是脏的,涉及丑陋的强制转换,特定于对齐,可能有任何作用)来检查某些T实际上是否等于某些template type而没有引入特定的空(辅助)基类(因为有时你根本不能)?
谢谢.
有没有办法互操作C#和Python存在?
我知道并且已经使用过IronPython(显然,它与dynamic关键字变得非常甜蜜),它允许解释应用程序Python内的脚本C#.
但我希望这个Python脚本能够访问C#类和方法.我知道,例如,这可以使用boost::python和实现C++,但我应该如何(如果可能的话)使用C#?
谢谢.
c++ ×6
c# ×4
.net ×2
boost ×2
templates ×2
boost-mpl ×1
c ×1
clr ×1
com ×1
compile-time ×1
construction ×1
containers ×1
interop ×1
lifetime ×1
malloc ×1
mef ×1
parameters ×1
python ×1
scripting ×1
type-traits ×1
variables ×1
variant ×1
xml ×1