小编Hei*_*nzi的帖子

Boost MPL:仅在(成员)函数存在时才调用它

我有一个类A,它有一个模板参数T.有一些用例,类T提供了一个函数func1(),并且有一些用例,其中T不提供它.A中的函数f()应该调用func1(),如果它存在的话.我认为这应该可以使用boost mpl,但我不知道如何.这里有一些伪代码:

template<class T>
class A
{
    void f(T param)
    {
        if(T::func1 is an existing function)
            param.func1();
    }
};
Run Code Online (Sandbox Code Playgroud)

更好的是其他情况:

template<class T>
class A
{
    void f(T param)
    {
        if(T::func1 is an existing function)
            param.func1();
        else
            cout << "func1 doesn't exist" << endl;
    }
};
Run Code Online (Sandbox Code Playgroud)

c++ boost sfinae boost-mpl template-meta-programming

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

Scala:重载(Seq [T])和(T*)

我有一个案例类,以Seq [T]作为参数:

case class MyClass(value: Seq[T])
Run Code Online (Sandbox Code Playgroud)

我现在希望能够写作

MyClass(t1,t2,t3)
Run Code Online (Sandbox Code Playgroud)

所以我定义了

object MyClass {
    def apply(value: T*) = new MyClass(value.toSeq)
}
Run Code Online (Sandbox Code Playgroud)

它不起作用,因为case类定义了

object MyClass {
    def apply(value: Seq[T])
}
Run Code Online (Sandbox Code Playgroud)

并且擦除后Seq [T]和T*具有相同的类型,因此我不能使它们超载.

但是我想允许两种访问方式.应该允许两种方式:

MyClass(t1,t2,t3)
MyClass(some_seq_of_T)
Run Code Online (Sandbox Code Playgroud)

由于Seq [T]和T*几乎是相同类型(至少在擦除之后;并且在具有参数T*的函数内部变为Seq [T]),我认为应该有一种方法允许两种方式调用它.

在那儿?

types scala overloading type-erasure

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

sbt:添加对scalatest库的依赖.哪里?

我使用SBT创建了一个scala项目,并使用scalatest编写了一些单元测试用例.但不知何故sbt test找不到org.scalatest包.

这是我的项目定义文件:

我正在使用SBT 0.11.3.

sbt compile在控制台上使用编译程序工作正常.此外,我发现了scalatest jar ~/.ivy2,所以SBT必须下载它.

sbt test它说,在跑步时

object scalatest is not a member of package org
[error] import org.scalatest.FlatSpec
...[many errors alike]
Run Code Online (Sandbox Code Playgroud)

并且运行sbt eclipse会创建一个不包含scalatest jar的.class路径.

我是否必须在其他地方指定测试依赖项?我该如何添加scalatest库?

scala sbt scalatest

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

IE浏览器帮助程序对象应该在哪里存储其数据文件?

我正在为Internet Explorer编写一个浏览器帮助程序对象,需要在硬盘上存储一些数据.是否有约定,存储此文件的位置?或者如果不是 - 我可以写入哪个目录(临时文件夹除外)?

winapi internet-explorer bho

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

scala宏:向类添加函数

我是scala宏的新手,我正在使用scala 2.10.0-RC3.

我想编写一个向类添加函数的宏.用法示例:

trait MyTrait {
  def addF = macro { /*add "def f = 3" to class*/ }
}

class MyClass extends MyTrait {
  addF //Adds the "def f" to MyClass
}

object Main {
  val t = new MyClass
  assert(t.f==3)
}
Run Code Online (Sandbox Code Playgroud)

我在以下场景中需要这个.我的第一次尝试没有使用宏但没有用,因为我不能继承两次相同的特性.

trait AddF[T] {
  def f(t: T) { /* ...do sthg ... */ }
}

class MyClass extends AddF[Int] with AddF[String]
Run Code Online (Sandbox Code Playgroud)

使用宏解决方案,我可以写

class MyClass extends MyTrait {
  addF[Int]()
  addF[String]()
}
Run Code Online (Sandbox Code Playgroud)

有没有办法用scala宏做到这一点?或者有另一种方法来实现这一目标吗?

reflection scala metaprogramming scala-2.10 scala-macros

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

处理后缀 sendmail 中的变音(非 ASCII 字符)(在控制台上发送邮件)

我写了一个需要发送电子邮件的 C++ 应用程序。

它通过调用

/usr/sbin/sendmail -f [sender] -t
Run Code Online (Sandbox Code Playgroud)

然后将邮件标题和正文写入 sendmail 进程的标准输入。

一切正常 - 除了变音或其他非 ASCII 字符。我怎样才能让它们正常工作?

我已经尝试设置

Content-Type: plain-text; charset=ISO-8859-1  
Run Code Online (Sandbox Code Playgroud)

作为邮件标题,也

Content-Type: plain-text; charset=UTF-8
Run Code Online (Sandbox Code Playgroud)

没有改变任何东西。似乎这个标题被忽略了。

postfix-mta smtp sendmail utf-8 diacritics

3
推荐指数
1
解决办法
7957
查看次数

Scala/Play:写入为流预设值的Enumeratee

我想编写一个枚举,只是将一个Input.El推入迭代,然后返回剩余的iteratee.我把它称为prepend,因为它只是通过为它添加一个值来改变流.这是我的尝试:

object Enumeratees {
  def prepend[T](toPrepend: T) = new Enumeratee[T, T] {
    def applyOn[A](inner: Iteratee[T, A]): Iteratee[T, Iteratee[T, A]] = {
      val prepended = Iteratee.flatten(inner.feed(Input.El(toPrepend)))
      Done(prepended, Input.Empty)
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

当我现在通过它来称呼它

Enumerator(1,2,3,4) |>> (Enumeratees.prepend(0)  &>> Iteratee.foreach[Int]{i=>println(i)})
Run Code Online (Sandbox Code Playgroud)

它只打印应该预先添加的0.枚举器中的其他值将被忽略.如果我也覆盖枚举的&>方法(转换方法),我可以使它工作:

def prepend[T](toPrepend: T) = new Enumeratee[T, T] {
  def applyOn[A](inner: Iteratee[T, A]): Iteratee[T, Iteratee[T, A]] = {
    val prepended = Iteratee.flatten(inner.feed(Input.El(toPrepend)))
    Done(prepended, Input.Empty)
  }

  override def transform[A](inner: Iteratee[T,A]): Iteratee[T,A] =
    Iteratee.flatten(inner.feed(Input.El(toPrepend)))
}
Run Code Online (Sandbox Code Playgroud)

但这不是一种非常干净的方式,因为applyOn方法仍然无效.我想我错误地认识了applyOn方法的含义.在我看来,它应该返回一个返回原始iteratee的iteratee,然后在原始iteratee上继续输入.

上面的转换方法应该解释一下,我想从我的枚举中得到什么样的行为.如何通过覆盖applyOn而不是transform来实现这种行为?

scala enumerator playframework iterate playframework-2.0

3
推荐指数
1
解决办法
645
查看次数

IP本地化:随着时间的推移,映射ip-&gt; location是否固定?

我正在管理一个Web平台,并希望获取一些统计数据,这些数据来自我的用户。我可以存储远程IP,并且我知道有些本地化服务可将IP映射到地理位置。

该映射如何完成?是否有固定表,哪个IP地址分配给哪个区域?

我必须在访问时请求映射,还是可以在几天/几个月/年后请求它?换句话说:从IP到位置的映射是固定的还是随时间变化的?

ip geolocation ip-geolocation

3
推荐指数
1
解决办法
578
查看次数

Joda DateTime:用字符串中的“CEST”解析日期

我想使用 joda 库(在 Scala 中,但应该与 java 相同)解析 DateTime。

来源看起来像

val dateParser = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss z")
val date = dateParser.parseDateTime("2012-08-28 15:35:00 CEST")
Run Code Online (Sandbox Code Playgroud)

在 Java 中,这看起来像

DateTimeFormatter dateParser = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss z");
DateTime date = dateParser.parseDateTime("2012-08-28 15:35:00 CEST");
Run Code Online (Sandbox Code Playgroud)

不幸的是,这不起作用,但会引发异常:

java.lang.IllegalArgumentException: Invalid format: "2012-08-28 15:35:00 CEST" is malformed at "CEST"
Run Code Online (Sandbox Code Playgroud)

为什么这不起作用?当然我可以忽略“CEST”部分而只解析其余部分,但在输入中“CEST”有时可以替换为“CET”,所以我不想忽略它。

java datetime scala jodatime

3
推荐指数
1
解决办法
6426
查看次数

在测试模式下使用flyway with play:找不到架构"public"

我在dev和prod模式下使用(成功)flyway-play插件.我也想在测试模式下使用它.文档说,它在测试模式下自动运行迁移.

我使用scala测试,我的测试用包裹在假的应用程序中

val fakeApplication = FakeApplication(additionalConfiguration = Map(
  "db.default.driver"->"org.h2.Driver",
  "db.default.url"->"jdbc:h2:mem:test;MODE=MySQL;DB_CLOSE_DELAY=-1;",
  "db.default.user"->"",
  "db.default.password"->""
))
Run Code Online (Sandbox Code Playgroud)

运行测试用例时,自动迁移失败并显示"Schema public not found":

[info]   com.googlecode.flyway.core.command.FlywaySqlScriptException: Error executing     statement at line 17: CREATE TABLE "public"."schema_version" (
[info]     "version_rank" INT NOT NULL,
[info]     "installed_rank" INT NOT NULL,
[info]     "version" VARCHAR(50) NOT NULL,
[info]     "description" VARCHAR(200) NOT NULL,
[info]     "type" VARCHAR(20) NOT NULL,
[info]     "script" VARCHAR(1000) NOT NULL,
[info]     "checksum" INT,
[info]     "installed_by" VARCHAR(100) NOT NULL,
[info]     "installed_on" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
[info]     "execution_time" INT NOT NULL,
[info] …
Run Code Online (Sandbox Code Playgroud)

h2 playframework flyway slick play-slick

3
推荐指数
1
解决办法
5215
查看次数