小编Yip*_*Yay的帖子

C++临时变量生命周期

这段代码有效吗?

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对象(从赋值标记开始)应该在构造之后被破坏(从而使引用无效).

然而,调试证明我错了,而且,我意识到我不太明白为什么在函数返回时会破坏临时变量.


我想我对一些基本的东西有很强的误解,所以请赐教:)

c++ variables construction lifetime visual-studio

5
推荐指数
1
解决办法
847
查看次数

使用非托管代码中的托管COM对象

假设我有一个众所周知的界面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)

问题1:

我想知道从以下代码下面发生了什么CLR:

IWellKnownInterface a = new MyWellKnownClass();
ExternMethod(a);
Run Code Online (Sandbox Code Playgroud)

我知道如果我们谈论从托管代码调用非托管COM对象,那就是构建一个合适的,Runtime Callable Wrapper并通过适当的参数转换委托调用.但是,当我们有一个托管的COM对象并且它被用在非托管代码中时,我找不到有关这种情况的任何信息.

问题2:

dynamic类型如何影响CLR相同情况下的行为?它会以某种方式改变内部托管到非托管的互操作逻辑吗?也许为MyWellKnownClass实例添加一些额外的包装器?

dynamic a = new MyWellKnownClass();
ExternMethod(a);
Run Code Online (Sandbox Code Playgroud)

.net c# com clr interop

5
推荐指数
1
解决办法
512
查看次数

MEF导入分辨率

假设我有一个带有一组标记有[Import]属性的字段的类,其中所有这些字段都禁止重构.

在某个时刻,new MyClassWithInjectedFields(...)使用MEF框架实例化此类,并使用框架注入所有相应的依赖项- 没有严重的,只有双射Export-To-Import映射.

问题:

  • 是否可以安全地假设在这种情况下,注入字段的值将保持不变,直到类实例被垃圾回收?

  • 或者可能有一些罕见/模糊的情况,它们可能MEF在运行时隐式更改?也许,当有人卸载或重新加载用于依赖解析的程序集时?

(我是新手MEF,我不确定在运行时是否有影响依赖图的方法,但是,显然可能存在).

.net c# dependency-injection mef dependency-management

5
推荐指数
1
解决办法
313
查看次数

C++基本模板问题

我对模板专业化略有困惑.

我有类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)

这编译很好,适用于Vector2Vector3.但是,假设我想为我做一个稍微高效的"+"操作,我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 …

c++ templates specialization

4
推荐指数
1
解决办法
184
查看次数

C++ - 参数问题

我正在寻找一些简单而有效的参数容器,它将像内存中的xml文件表示(或ini文件,作为另一个示例).

我的意思是,基本上它可以为每个部分存储部分和参数集,具有简单的访问器GetValue("ParameterName")和简单的返回值转换.

如果它是可序列化的将是很好的.

我昨天写了类似的东西,嗯,它适合我的需要,但可能有更方便和灵活的东西?

也许是某种参数图boost

谢谢

c++ parameters containers boost

4
推荐指数
1
解决办法
297
查看次数

C++提升变体问题

我知道它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.

有人知道吗?

c++ boost variant compile-time boost-mpl

4
推荐指数
1
解决办法
721
查看次数

C/C++ - 覆盖默认函数

我有以下问题:

难道微软的Visual Studio (我使用的是2008 SP1)提供任何方法来覆盖非标准C函数,例如malloc,memcpy

假设我有一些外部构建的库,其中包含malloc.objmemcpy.obj.图书馆被称为library.lib.

我应该如何构建我的项目,以便编译器使用我的(覆盖)版本malloc()memcpy()例程而不是提供的那些(我假设它们共享相同的语法)

整个这个问题的关键在于改变malloc我的项目中的每一个而不使用类似my_malloc或类似的名称别名,这样我就可以比较性能.

这可能吗?

谢谢.

c c++ malloc visual-studio-2008

4
推荐指数
2
解决办法
3439
查看次数

C++ - 类型特征问题

我想知道在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++ templates type-traits

4
推荐指数
2
解决办法
445
查看次数

C#脚本(python)

有没有办法互操作C#Python存在?

我知道并且已经使用过IronPython(显然,它与dynamic关键字变得非常甜蜜),它允许解释应用程序Python内的脚本C#.

但我希望这个Python脚本能够访问C#类和方法.我知道,例如,这可以使用boost::python和实现C++,但我应该如何(如果可能的话)使用C#

谢谢.

c# python scripting

4
推荐指数
1
解决办法
797
查看次数

C#xml文档

.xml程序集(.dll文件)附带的文档文件的用途是什么.

我知道,如何构建一个(例如,这里),但它们可以用于什么?

此外,如果此文档可以集成到MS Visual Studio环境中,应该如何完成?

c# xml

4
推荐指数
2
解决办法
1409
查看次数