小编Jam*_*ard的帖子

"ODR使用"是什么意思?

这只是出现在另一个问题的背景下.

显然,类模板中的成员函数只有在使用ODR时才会被实例化.有人可以解释一下究竟是什么意思.关于单一定义规则(ODR)维基百科文章未提及" ODR使用 ".

但是标准将其定义为

名称显示为潜在评估表达式的变量是odr-used,除非它是满足出现在常量表达式(5.19)中的要求的对象,并且立即应用左值到右值转换(4.1).

在[basic.def.odr]中.

编辑:显然这是错误的部分,整个段落包含不同事物的多个定义.这可能是类模板成员函数的相关内容:

一个非重载函数,其名称显示为可能已评估的表达式或一组候选函数的成员,如果从可能已评估的表达式引用时通过重载决策选择,则使用该函数,除非它是纯虚拟的函数及其名称未明确限定.

但我不明白,这个规则如何在多个编译单元中工作?如果我显式实例化一个类模板,是否所有成员函数都被实例化了?

c++ templates one-definition-rule

79
推荐指数
2
解决办法
1万
查看次数

标识列上具有父/子关系的SqlBulkCopy和DataTables

我们需要根据父表中的Identity主键更新几个具有父/子关系的表,父表由一个或多个子表作为外键引用.

  • 由于大量的数据,我们想在内存中建立这些表,然后使用SqlBulkCopy的从C#来无论从数据集或数据表单独更新数据库的连接质量.
  • 我们还希望从多个线程,进程和可能的客户端并行执行此操作.

我们在F#中的原型显示了许多承诺,性能提高了34倍,但此代码强制在父表中使用已知的Identity值.如果没有强制,当SqlBulkCopy插入行时,Identity列会在数据库中正确生成,但Identity值不会在内存中的DataTable中更新.此外,即使它们是,也不清楚DataSet是否能正确地修复父/子关系,以便随后可以用正确的外键值写入子表.

任何人都可以解释如何让SqlBulkCopy更新Identity值,以及如何配置DataSet以保留和更新父/子关系,如果在单个DataTables上调用DataAdapter到FillSchema时不自动完成.

我不想要的答案:

  • 读取数据库以查找当前最高的Identity值,然后在创建每个父行时手动递增它.不适用于多个进程/客户端,并且据我所知,失败的事务可能会导致某些标识值被跳过,因此这种方法可能会破坏关系.
  • 一次一个地写出父行,并要求返回Identity值.这通过使用SqlBulkCopy至少失去了一些收益(是的,有更多子行比父行,但仍然有很多父行).

类似于以下未回答的问题:

.net c# sql-server sqlbulkcopy

25
推荐指数
2
解决办法
2万
查看次数

JScript.NET可以用来编写.NET应用程序的脚本吗?

由于MS 似乎在服务器端(ASP.NET Futures)和客户端(Silverlight)的最新DLR中杀死了托管JavaScript,所以有人成功使用非过时的API来允许使用JScript.NET编写应用程序对象的脚本和/或可以解释如何这样做?Mono/JScript解决方案也可以接受,如果它稳定并满足下面的要求.

我们感兴趣的是将使用Microsoft JScript引擎和ActiveScript API的脚本宿主升级到具有更高性能和更易扩展性的东西.我们有超过16,000个服务器端脚本,重量超过42MB,因此重写为另一种脚本语言是不可能的.

我们的具体要求是:

  • 比Microsoft JScript(ActiveScript)引擎更好的性能
    • 更好的运行时性能和/或
    • 保留预解析或编译的脚本(不要在每次运行时重新解析)
    • 较低或相等的内存消耗
  • 完整的ECMA-262 ECMAScript兼容性
    • 可以容忍一点移植
  • 将自定义对象注入脚本命名空间
    • .NET对象(不是硬性要求)
    • 用.NET包装的COM对象或COM对象
  • 从Script实例化COM对象
    • àla"new ActiveXObject(progid)"
    • 鉴于前面的优先级低
  • 包含文件
    • 将"帮助程序脚本"预加载到脚本执行上下文中
    • "包含"功能或声明(如上所述,易于创建)
  • 支持全局范围的代码
    • 执行全局范围的代码
    • 保留在全局范围初始化的值
    • 从全局范围中提取值
    • 在全球范围内注入和替换值
  • 调用脚本定义的函数
    • 带参数
    • 并可访问先前初始化的全局范围
  • 源级调试
  • 商业或开源支持
  • 非过时的API

mono automation dynamic-language-runtime jscript.net managed-jscript

8
推荐指数
1
解决办法
2195
查看次数

如何在F#中绘制数据系列?

关于FSHUB,LethalLavaLand说,

让我策划我的价值观!

所以问题是,如何使用内置的.NET 4.0控件在F#中绘制数据系列?

math matlab charts f#

8
推荐指数
1
解决办法
3346
查看次数

在F#中,是否可以将对可变,默认值的引用作为参数传递?

对于Froto项目(F#中的Google Protobuf),我试图将反序列化代码从使用'a ref对象更新为传递值byref<'a>,以提高性能.

但是,下面的代码失败了hydrator &element field:

type Field = TypeA | TypeB | Etc

let hydrateRepeated
        (hydrator:byref<'a> -> Field -> unit)
        (result:byref<'a list>)
        (field:Field) =
    let mutable element = Unchecked.defaultof<'a>
    hydrator &element field
    result <- element :: result
Run Code Online (Sandbox Code Playgroud)

错误FS0421:此时不能使用变量'element'的地址

有什么办法可以让代码在不改变hydrator参数签名的情况下工作吗?

我非常清楚我可以使用hydrator:'a ref -> Field -> unit并开始工作.但是,目标是支持反序列化为record类型,而无需ref在每次反序列化记录时在堆上创建一堆对象.

请注意,以下代码完全合法,并且与hydrator上面的函数声明具有相同的签名,因此我不清楚问题是什么.

let assign (result:byref<'a>) (x:'a) =
    result <- x

let thisWorks() =
    let mutable v = …
Run Code Online (Sandbox Code Playgroud)

f# mutable

8
推荐指数
1
解决办法
804
查看次数

可以扩展现有类型以使用Seq.sum等吗?

最近一直在与很多TimeSpans合作,并且需要获得总和和平均值.
但是,TimeSpan既不定义运算符get_Zero也不定义DivideByInt,因此Seq.sum和Seq.average不能直接使用此类型.以下无法编译:

open System
type System.TimeSpan
    with
        static member Zero with get() = TimeSpan()
        static member (/) (n:DateTime, d:int) = DateTime( n.Ticks / (int64) d )

let ts = [ TimeSpan(10L); TimeSpan(99L) ]
let sum = ts |> Seq.sum
let avg = ts |> Seq.average
Run Code Online (Sandbox Code Playgroud)
  • 错误:"TimeSpan"类型不支持任何名为"get_Zero"的运算符
  • 错误:类型'TimeSpan'不支持任何名为'DivideByInt'的运算符
  • 警告:扩展成员无法提供操作员重载.考虑将运算符定义为类型定义的一部分.

是否有一些F#魔术可以在现有类型上定义这些运算符?

我知道以下内容可行(并且应该更有效地启动),但我仍然对上面的内容感到好奇,所以我可以将它添加到我的工具箱中以便与其他类型一起使用.

let sum = TimeSpan( ts |> Seq.sumBy (fun t -> t.Ticks) )
let avg = TimeSpan( let len = ts |> Seq.length in sum.Ticks / int64 len )
Run Code Online (Sandbox Code Playgroud)

f#

7
推荐指数
1
解决办法
903
查看次数

如何在 C++ 中抽象延迟初始化?

前几天在重构一些代码以提高性能时,我需要一个答案来创建延迟初始化的成员变量,但这也为非 c++11 编译器提供了一个方便但可选的非 lambda 接口。

这是我想抽象的惰性实例化的典型模式:

if( !bInitialized )
{
    value = doInitialization();
    bInitialized = true;
}
return value;
Run Code Online (Sandbox Code Playgroud)

对于我的使用,我想要一些灵活性:

  • 允许显式初始化,就像上面的例子
  • 提供对惰性的隐式访问,就好像它是底层数据类型一样
  • 处理未初始化的访问(抛出),以防我搞砸了显式初始化(​​例如,忘记赋值)
  • 还通过函数、函子和/或 lambda 支持真正的延迟初始化
  • 允许通过指向包含值的指针进行手动初始化(例如,在调用 Win32 API 时)
  • 允许重新分配值;在大多数情况下,将惰性视为底层数据类型。

我有我要发布的代码作为答案,但会对不同的方法感兴趣。您的答案不必满足所有这些要求;对于某些用例,更简单可能更好......

c++ boost lazy-loading std lazy-evaluation

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

如何在使用异步Socket.BeginReceive时检测超时?

使用F#中的原始套接字编写异步Ping,以使用尽可能少的线程启用并行请求.不使用"System.Net.NetworkInformation.Ping",因为它似乎为每个请求分配一个线程.我也对使用F#异步工作流感兴趣.

当目标主机不存在/响应时,下面的同步版本会正确超时,但异步版本会挂起.当主机做出响应时,两者都有效.不确定这是.NET问题还是F#问题......

有任何想法吗?

(注意:进程必须以Admin身份运行才能允许Raw Socket访问)

这会引发超时:

let result = Ping.Ping ( IPAddress.Parse( "192.168.33.22" ), 1000 )
Run Code Online (Sandbox Code Playgroud)

但是,这挂起:

let result = Ping.AsyncPing ( IPAddress.Parse( "192.168.33.22" ), 1000 )
             |> Async.RunSynchronously
Run Code Online (Sandbox Code Playgroud)

这是代码......

module Ping

open System
open System.Net
open System.Net.Sockets
open System.Threading

//---- ICMP Packet Classes

type IcmpMessage (t : byte) =
    let mutable m_type = t
    let mutable m_code = 0uy
    let mutable m_checksum = 0us

    member this.Type
        with get() = m_type

    member this.Code
        with get() = m_code

    member this.Checksum = …
Run Code Online (Sandbox Code Playgroud)

.net sockets f# asynchronous raw-sockets

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