小编Tho*_*ing的帖子

将无效的int值转换为枚举

说我有

enum Foo { Foo0, Foo1, Foo2 };
Run Code Online (Sandbox Code Playgroud)

请注意,没有显式声明的Foo常量值为3(它们是0,1和2).

以下是否调用未定义的行为?

Foo yay = (Foo) 3;
Run Code Online (Sandbox Code Playgroud)

特别注意3可能适合内部表示Foo.

c++ enums

6
推荐指数
1
解决办法
270
查看次数

简单的“Read”实例错误地“read”

为什么这个 Read 实例解析不一致?

import qualified Data.List as List

data Foo = Foo

instance Show Foo where
  show _ = "Foo"

instance Read Foo where
  readsPrec _ s = case List.stripPrefix "Foo" s of
    Just rest -> [(Foo, rest)]
    Nothing -> []
Run Code Online (Sandbox Code Playgroud)

这是预期的:

Test> reads "" :: [(Foo, String)]
[]
Run Code Online (Sandbox Code Playgroud)

这是出乎意料的:

Test> read "" :: Foo
Foo
Run Code Online (Sandbox Code Playgroud)

我希望它会抛出。

haskell

6
推荐指数
1
解决办法
53
查看次数

C++模板化返回值与纯虚函数

我有一个抽象的Handle <T>类,它包含类型为T的对象的引用.我希望能够将该类转换为Handle <U>,其中U是T的超类.我会使用继承,但这不起作用.我该怎么做呢?什么是好的选择?

示例伪代码:

template<class T>
class Handle {
public:
    virtual ~Handle () {}
    virtual T & operator* () const = 0;
    virtual T * operator-> () const = 0;
    virtual template<class U> operator Handle<U>* () const = 0; // being lazy with dumb pointer
};

template<class T>
class ConcreteHandle : public Handle<T> {
public:
    explicit template<class U> ConcreteHandle (U * obj) : obj(obj) {}
    virtual ~ConcreteHandle () {}
    virtual T & operator* () const {
        return *obj;
    }
    virtual …
Run Code Online (Sandbox Code Playgroud)

c++ virtual templates abstract-class

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

重叠模式匹配

我有以下代码:

test :: String -> Bool
test "g" = True
test "global" = True
test _ = False
Run Code Online (Sandbox Code Playgroud)

当我加载到GHCi(7.0.3)时,我得到:

Warning: Pattern match(es) are overlapped
         In an equation for `test': test "g" = ...
Run Code Online (Sandbox Code Playgroud)

这是一个错误还是我错过了什么?

以下举行:

test "" == False
test "g" == True
test "gl" == False
test "global" == True
test "globalx" == False
Run Code Online (Sandbox Code Playgroud)

更新:

我在用{-# LANGUAGE OverloadedStrings #-}.

haskell ghc overlapping-matches

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

std ::与reverse_iterator相等

使用reverse_iteratorwith 是否合法std::equal

例如,这些合法吗?

std::equal(v.begin(), v.end(), w.rbegin())

std::equal(v.rbegin(), v.rend(), w.begin())

std::equal(v.rbegin(), v.rend(), w.rbegin())
Run Code Online (Sandbox Code Playgroud)

c++ stl

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

C++比较两个字符串文字

将字符串文字与另一个字符串文字与==运算符(或!=)进行比较时,结果是否已明确定义?

例如,以下是否保证可以保留?

assert("a" == "a");
assert("a" != "b");
Run Code Online (Sandbox Code Playgroud)

请不要说"使用std :: string"之类的东西.我只想知道这个具体案例.

c++ string-literals

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

枚举上的std :: less

不标准的保证,std::less<MyEnumType>将责令MyEnumType仿佛值MyEnumType被强制转换为适当大小的整数类型?

enum MyEnumType { E1 = 0, E2 = 6, E3 = 3 };
Run Code Online (Sandbox Code Playgroud)

c++ enums language-lawyer

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

C#泛型隐式运算符返回类型

为了自动将代码从C++转换为C#,我希望有一个C#类(伪代码)

class Null {
    public static implicit operator T (Null unused) {
        return null;
    }
}
Run Code Online (Sandbox Code Playgroud)

这在诸如此类的情况下非常有用

foo(T1 x) { ... }
foo(T2 x) { ... }

foo(null); // ambiguous
Run Code Online (Sandbox Code Playgroud)

出于某些原因,通常不可能以编程方式消除上述类型的歧义.例如

foo((T1)null); // Discovering T1 over T2 is not possible or really hard to do
Run Code Online (Sandbox Code Playgroud)

但如果我Null上面的课程,我可以通过编程方式添加

foo(Null x) {...}
Run Code Online (Sandbox Code Playgroud)

并生成

foo(new Null()); // not ambiguous
Run Code Online (Sandbox Code Playgroud)

诀窍是使用new Null()代替每个生成的null甚至

T1 x = new Null();
Run Code Online (Sandbox Code Playgroud)

编译x == null.

是否可以写这样的课程?

c# implicit-conversion

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

无点镜头创建不进行类型检查

在函数中test,我遍历一个列表,从它的成员生成镜头,然后打印一些数据.当我使用有点的调用样式时,这可以工作.当我点免费时,它无法进行类型检查.

为什么会这样,我该如何解决这个问题呢?

对我来说,GHC并没有保留使用无点风格时排名较高f(镜头中)的信息Functor,但我不太确定.

我正在使用GHC 7.8.3

{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE TemplateHaskell #-}

import Control.Lens
import Control.Monad
import Data.List
import Data.Maybe

type PlayerHandle = String

data Player = Player { _playerHandle :: PlayerHandle }
makeLenses ''Player

data GameState = GameState { _gamePlayers :: [Player] }
makeLenses ''GameState

type PlayerLens = Lens' GameState Player

getPlayerLens :: PlayerHandle -> PlayerLens
getPlayerLens handle f st = fmap put' get'
    where
        players = st^.gamePlayers
        put' player = let …
Run Code Online (Sandbox Code Playgroud)

haskell pointfree haskell-lens

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

重叠实例以展平元组

我正在尝试编写代码以从元组链中删除空元组.编译器拒绝该程序:

码:

{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE OverlappingInstances #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE TypeOperators #-}

infixr 9 :*
data a :* b = a :* !b
  deriving (Show, Eq, Ord)

class Flatten a b | a -> b where
  flatten :: a -> b

instance Flatten a a where
  flatten = id

instance Flatten a b => Flatten (() :* a) b where
  flatten (() :* y) = flatten …
Run Code Online (Sandbox Code Playgroud)

haskell functional-dependencies

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