小编Sh4*_*4pe的帖子

Windows上的C++ 11

我想知道在C++ 11中编写软件在Windows上的运行情况有多好.使用Windows的本机编译器之一是最舒适的(也是最自然的) - 我在这里考虑Visual Studio 2012 Express或Visual Studio 2013 Express.到目前为止我能找到的所有事情都是

  1. http://msdn.microsoft.com/en-us/library/vstudio/hh567368.aspx(VC10 和VC11的C++ 11特性比较,这看起来很糟糕)
  2. http://blogs.msdn.com/b/vcblog/archive/2013/06/28/c-11-14-stl-features-fixes-and-breaking-changes-in-vs-2013.aspx(不是真的透明,没有给我一个好主意它是如何工作的)

有没有人有任何经验,当前的Visual Studio版本如何处理C++ 11?我真的想开始使用auto,lambdas,可变参数模板,模板别名,初始化列表和右值引用(仅举几例)和所有其他好东西,但如果Windows可能是一个问题,我可能不得不使用C++ 03进一步.

另一种可能性似乎是在Windows上安装LLVM和Clang.我的主要平台是OSX,在该系统上,Clang对C++ 11的支持非常好.但我读到,用于C++(libc ++)的标准库的LLVM版本在Windows上运行不正常.所以LLVM/clang可能不是一个选择.

您对Windows上的C++ 11开发有何看法?

谢谢!

c++ windows c++11

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

通过值与引用传递std算法迭代器参数

我想知道为什么在STL中的许多模板算法中,参数不是通过引用传递的,而是通过值传递的.以下是<iterator>标题中的示例:

template<class InputIterator>
typename iterator_traits<InputIterator>::difference_type
distance (InputIterator first, InputIterator last);
Run Code Online (Sandbox Code Playgroud)

当我将两个迭代器传递给此函数时,它们将被复制.我天真的想法是,最好通过const-reference传递这些迭代器,以避免复制迭代器对象:

template<class InputIterator>
typename iterator_traits<InputIterator>::difference_type
distance (const InputIterator &first, const InputIterator &last);
Run Code Online (Sandbox Code Playgroud)

可以说迭代器通常是非常小的对象,复制它们并不昂贵.但即便如此:便宜的复制将比没有复制更昂贵.

那么在STL版本中,迭代器是按值传递的原因是什么?

谢谢!

c++ templates stl

14
推荐指数
3
解决办法
6400
查看次数

从命令行覆盖宏

我想从命令行覆盖一个宏.在我的源代码中,有一个这样的定义:

#define MY_FOO 1
Run Code Online (Sandbox Code Playgroud)

我想要的是在编译程序时设置此宏的值:

g++ -DMY_FOO=2 ...
Run Code Online (Sandbox Code Playgroud)

但是,宏源被源代码重新定义为旧值1.问题是我不拥有首先定义宏的源代码部分.如果它是我自己的代码,我可以简单地写

#ifndef MY_FOO
#define MY_FOO 1
#endif
Run Code Online (Sandbox Code Playgroud)

我的问题就不复存在了.那么是否可以使用g ++在命令行上指定一个宏,以便源代码无法重新定义它?

c++ macros g++ c-preprocessor

10
推荐指数
1
解决办法
3510
查看次数

在哈斯克尔的Monads上循环

我对Haskell很新,所以这可能是一个愚蠢的问题.我有一个功能

foo :: Int -> IO ()
Run Code Online (Sandbox Code Playgroud)

其结果将打印一些有用的信息.现在我想这样做:

do
    foo 0
    foo 1
    foo 0
    foo 2
    foo 3
Run Code Online (Sandbox Code Playgroud)

我怎么能把它写成循环?我的问题是'连接'Monads,这是由do语句自动完成的......

谢谢您的帮助!

haskell

8
推荐指数
2
解决办法
359
查看次数

为特殊文件类型设置'git diff'

我想在我的一个存储库中管理Excel文件.区分它们是一个问题(它们是二进制文件).但是,有一个很好的工具来区分它们:https://github.com/na-ka-na/ExcelCompare

我想用它来设置它 .gitattributes

*.xls diff=excel
*.xlsx diff=excel
Run Code Online (Sandbox Code Playgroud)

并在.git/config:

[diff "excel"]
    textconv = excel_cmp.bat
Run Code Online (Sandbox Code Playgroud)

该命令excel_cmp.bat file1.xls file2.xls非常有效.但是,我上面使用的设置似乎尝试使用excel文件转换为文本excel_cmp.bat,然后对文本输出进行差异.

如何设置diff工具来区分两个文件 - 而不是首先转换为文本然后区分文本输出?

编辑:

在上面的设置中,git似乎要做的是对excel_cmp.bat <file1>和的输出进行区分excel_cmp.bat <file2>.但我想要的是excel_cmp.bat <file1> <file2>.我怎么设置它?

git diff

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

向自定义方法添加文档(ScriptMethod)

可以使用标准注释在其正文的开头记录自定义PowerShell脚本或函数:

function wellDocumented {
   <#
       .SYNOPSIS
       A well documented function
       .DESCRIPTION
       "Be verbose in documentation" - someone
       .PARAMETER foo
        should be 42 or 15, but not more
    #>
    param( [int]$foo )
    <# ... #>
}
Run Code Online (Sandbox Code Playgroud)

Get-Help wellDocumented然后返回一些不错的信息.但是如何ScriptMethod在自定义对象中记录自定义?以下不起作用:

$myClass | add-member -memType ScriptMethod -Name "Foo" -Value {
    <#
        .SYNOPSIS
        Something - but brief
        .DESCRIPTION
        Something
    #>
    <# ... #>
}
Run Code Online (Sandbox Code Playgroud)

是否有一些标准方法来记录您的ScriptMethods?

powershell powershell-2.0 powershell-3.0

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

Makefile:can'罐头食谱'有参数吗?

我的问题涉及GNU的制作.

如果您有一系列命令可用作多个目标的配方,则罐装配方会派上用场.我可能看起来像这样:

define run-foo
# Here comes a
# sequence of commands that are
# executed line by line
endef
Run Code Online (Sandbox Code Playgroud)

现在您可以像这样使用罐装配方:

file1: input1:
    $(run-foo)

$(pattern) : sub/% : %.inp
    $(run-foo)
Run Code Online (Sandbox Code Playgroud)

等等.我想知道是否有可能定义带参数的罐装食谱(或类似的东西),以便我可以像这样执行它们:

file2: input2
    $(run-foo) specific-parameter2 "additional"

file3: input3
    $(run-foo) another-parameter3 "text"
Run Code Online (Sandbox Code Playgroud)

这可能吗?任何提示欢迎:)

dependencies build-process makefile gnu-make

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

部分专业的模板朋友

我有一个课程模板

template< typename G, int N > class Foo { /* ... */ };
Run Code Online (Sandbox Code Playgroud)

我希望专业化N=0成为另一个类的朋友,但我不知道它的语法(我自己也找不到它).我试过了:

template< typename T >
class Bar {
  template< typename G > friend class Foo< G, 0 >;

  /* ... */
};
Run Code Online (Sandbox Code Playgroud)

我希望任何Foo< G, 0 >一个G型成为他的朋友class Bar< T >.这个的正确语法是什么?

谢谢!

c++ templates friend

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

重载运算符<<表示嵌套类模板

我有以下设置:

template< class T >
struct Foo {

  struct Bar {
    Bar ( const T &t ) : otherT_( t ) {}

    T otherT_;
  };

  Foo ( const T &t ) : myT_( t ) {}

  T myT_;
};
Run Code Online (Sandbox Code Playgroud)

现在,我想制作Foo< T >::Barstremable到std :: cout和朋友的实例.我试过这个:

template< class T >
std::ostream& operator<< ( std::ostream &os, 
                           const typename Foo< T >::Bar &bar ) {
  os << "<bar: " << bar.otherT_ << ">";
  return os;
}
Run Code Online (Sandbox Code Playgroud)

但是以下代码无法编译:

  Foo< int > foo( 5 …
Run Code Online (Sandbox Code Playgroud)

c++ templates operator-overloading friend nested-class

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

使用相同名称的typedef替换预处理器宏

我想用一个具有相同名称的正确typedef替换宏.我有

#define FooType char*
Run Code Online (Sandbox Code Playgroud)

在第三方库中,这打破了我的一些代码(更确切地说:我被迫使用的一些代码以及我自己无法改变的代码).我想用一个同名的typedef替换它,然后#undef用宏替换它.我试过这样的事情:

#define TMP_MACRO FooType
#undef FooType
typedef TMP_MACRO FooType;
#undef TMP_MACRO
Run Code Online (Sandbox Code Playgroud)

但预处理器将其扩展为:

typedef FooType FooType;
Run Code Online (Sandbox Code Playgroud)

(至少那是g++ -E告诉我的).所以宏TMP_MACRO不会立即扩大.由于'FooType'不存在,因此无法编译.

如何FooType用适当的类型替换宏,然后取消定义宏?或者这不可能吗?

c++ macros c-preprocessor

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

Haskell中的诊断输出

我学习了命令式语言的编程,主要是C++和C语言,所以函数式方法对我来说是非常新的.

当我以前编写函数/方法时,我通常采用"增量"方法(可能大多数人都这样做):编写一小部分代码,然后检查到目前为止的结果是否符合预期(通常只是将它们打印到stdout with printf或std :: cout),改进算法,增强算法,然后检查到目前为止的结果是否符合预期(通常只需用printf或std :: cout打印到stdout),精炼...我非常很少把整个方法写成一个整体.

这种"增量"方法的关键是具有诊断输出的能力(在上面的例子中是printf或std :: cout).但是在Haskell中(据我现在所理解的),如果我想 - 比如说 - 使用'putStrLn'向stdout写一些东西,我必须改变我的函数的签名,因为'putStrLn'只返回一个IO Monad包含我想要打印的信息,但是在调用'putStrLn'时不打印它,对吗?因此,每次我想使用'putStrLn'进行诊断输出时,我必须更改当前函数的签名以及我所有其他函数调用它的方式等...

那么有一种廉价而简单的方法可以将函数的"局部变量"的值打印到标准输出中吗?

或者仅仅是因为我要求这个标志我不理解Haskell编程的基本部分?

haskell

3
推荐指数
2
解决办法
363
查看次数

查询缓冲的core.async/chan中的元素数量

有缓冲chan,说

(def c (clojure.core.async/chan 100))
Run Code Online (Sandbox Code Playgroud)

是否有可能查询chan中当前有多少元素?

clojure core.async

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

在PowerShell中使用多个参数实现自己的方法

我想用一个带有多个参数的方法创建一个自定义对象.我已经设法添加一个带一个参数的方法,它似乎工作:

function createMyObject () {
    $instance = @{}

    add-member -in $instance scriptmethod Foo {
        param( [string]$bar = "default" )
        echo "in Foo( $bar )"    
    }
    $instance
}
$myObject = createMyObject
Run Code Online (Sandbox Code Playgroud)

但每次我尝试通过简单地[string]$secondParam在方法的param-section中添加另一个子句来添加一个带有两个参数的方法时,调用

$myObject.twoParamMethod( "firstParam", "secondParam" )
Run Code Online (Sandbox Code Playgroud)

不起作用.我语言中的错误消息表示"无法将索引应用于NULL数组".

任何提示?谢谢!

powershell object

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