我想知道在C++ 11中编写软件在Windows上的运行情况有多好.使用Windows的本机编译器之一是最舒适的(也是最自然的) - 我在这里考虑Visual Studio 2012 Express或Visual Studio 2013 Express.到目前为止我能找到的所有事情都是
有没有人有任何经验,当前的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开发有何看法?
谢谢!
我想知道为什么在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版本中,迭代器是按值传递的原因是什么?
谢谢!
我想从命令行覆盖一个宏.在我的源代码中,有一个这样的定义:
#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 ++在命令行上指定一个宏,以便源代码无法重新定义它?
我对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语句自动完成的......
谢谢您的帮助!
我想在我的一个存储库中管理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>
.我怎么设置它?
可以使用标准注释在其正文的开头记录自定义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?
我的问题涉及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)
这可能吗?任何提示欢迎:)
我有一个课程模板
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 >
.这个的正确语法是什么?
谢谢!
我有以下设置:
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 >::Bar
stremable到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) 我想用一个具有相同名称的正确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++和C语言,所以函数式方法对我来说是非常新的.
当我以前编写函数/方法时,我通常采用"增量"方法(可能大多数人都这样做):编写一小部分代码,然后检查到目前为止的结果是否符合预期(通常只是将它们打印到stdout with printf或std :: cout),改进算法,增强算法,然后检查到目前为止的结果是否符合预期(通常只需用printf或std :: cout打印到stdout),精炼...我非常很少把整个方法写成一个整体.
这种"增量"方法的关键是具有诊断输出的能力(在上面的例子中是printf或std :: cout).但是在Haskell中(据我现在所理解的),如果我想 - 比如说 - 使用'putStrLn'向stdout写一些东西,我必须改变我的函数的签名,因为'putStrLn'只返回一个IO Monad包含我想要打印的信息,但是在调用'putStrLn'时不打印它,对吗?因此,每次我想使用'putStrLn'进行诊断输出时,我必须更改当前函数的签名以及我所有其他函数调用它的方式等...
那么有一种廉价而简单的方法可以将函数的"局部变量"的值打印到标准输出中吗?
或者仅仅是因为我要求这个标志我不理解Haskell编程的基本部分?
有缓冲chan
,说
(def c (clojure.core.async/chan 100))
Run Code Online (Sandbox Code Playgroud)
是否有可能查询chan中当前有多少元素?
我想用一个带有多个参数的方法创建一个自定义对象.我已经设法添加一个带一个参数的方法,它似乎工作:
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数组".
任何提示?谢谢!
c++ ×6
templates ×3
friend ×2
haskell ×2
macros ×2
powershell ×2
c++11 ×1
clojure ×1
core.async ×1
dependencies ×1
diff ×1
g++ ×1
git ×1
gnu-make ×1
makefile ×1
nested-class ×1
object ×1
stl ×1
windows ×1