如果下面的代码是未定义的行为,我正在尝试获取信息,我确实在这里阅读过。
特别是我想确保迭代器变量iter
在移动元素与目标范围重叠的情况下有效。
我认为这不好但无法确认,有什么更好的方法可以做到这一点?
#include <vector>
#include <iostream>
int main()
{
// move 3, 4 closer to beginning
std::vector<int> vec { 1, 2, 3, 4, 5, 6, 7 };
auto iter = std::move(vec.begin() + 2, vec.end() - 3, vec.begin() + 1);
std::cout << *iter << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
也没有提到 thisiter
应该指向什么?
根据cppreference [[deprecated("message string")]]
我们应该能够使用该符号,但在 VS 中会导致错误。
例如,我不想在 UNICODE 构建中为 ANSI 方法发出警告,反之亦然:
#ifdef UNICODE
[[deprecated("This method does not work well in UNICODE builds")]]
#endif // UNICODE
void f() {}
Run Code Online (Sandbox Code Playgroud)
编译器不允许我编译,但标准说该属性应该允许使用但会发出警告消息。
如何解决这个问题?,顺便说一句。我的项目设置为最大程度地符合标准。
VS违反标准的原因是什么,有没有更好的方法来对上述情况发出警告?
我见过一个类似这样的函数:
function
{
[CmdletBinding()]
[OutputType([Boolean])]
param (
[bool] $param
}
# ...
}
Run Code Online (Sandbox Code Playgroud)
Boolean
和之间有什么区别bool
?
例如,我想减少打字System
和其他根命名空间
[string] $ComputerName = [Environment]::MachineName
Run Code Online (Sandbox Code Playgroud)
对比
[System.String] $ComputerName = [System.Environment]::MachineName
Run Code Online (Sandbox Code Playgroud)
另一个例子:
[Net.Dns]::GetHostEntry("192.168.1.1")
Run Code Online (Sandbox Code Playgroud)
对比
[System.Net.Dns]::GetHostEntry("192.168.1.1")
Run Code Online (Sandbox Code Playgroud)
键入System
和需要类似的父命名空间时是否有任何原因和特定情况?
我经常想知道为什么System
毕竟有命名空间,因为一切都在该命名空间内,那么与该命名空间有什么关系呢?这是胡说八道;无论如何,该术语System
应该是什么意思?这里与操作系统无关。但是对于 NET 框架中的所有内容。
我假设调用静态方法时可能会出现异常,但我不知道 C# 所以无法自己回答这个问题。
波纹管是一个示例函数,它声明OutputType
.
我知道这仅用于文档目的,但这里的问题是当我调用 PSScriptAnalyzer 时:
invoke-scriptanalyzer . -IncludeRule PSUseOutputTypeCorrectly
Run Code Online (Sandbox Code Playgroud)
它会告诉我:
cmdlet“Test-Function”返回“System.Object[]”类型的对象,但该类型未在 OutputType 属性中声明。
function Test-Function
{
[CmdletBinding()]
[OutputType([System.Management.Automation.PSCustomObject[]])]
param ()
[PSCustomObject[]] $TestObject = @()
for ($i = 0; $i -lt 5; $i++)
{
$TestObject += [PSCustomObject]@{
Key1 = "Value1"
Key2 = "Value2"
}
}
return $TestObject
}
Run Code Online (Sandbox Code Playgroud)
问题是我怀疑此信息是误报,但无法确认。
我想我声明这个OutputType
属性很好,或者也许不是?
为什么我需要指定[OutputType([System.Object[]])]
为输出类型?如果我回来的话PSCustomObject[]
?
我正在使用多态和模板编写一个类,就像:
class base {
virtual ~base() = default;
};
template <typename T>
class derived : public base {
T a;
void save(T a_) { a = a_; }
};
Run Code Online (Sandbox Code Playgroud)
所以当我想使用 function 时derived::save()
,基本上,我需要dynamic_cast
,但它无法检查它是好演员还是坏演员:
void test() {
base *p = new derived<float>();
// good case
dynamic_cast<derived<float>*>(p)->save(1);
// bad case
dynamic_cast<derived<int>*>(p)->save(1);
}
Run Code Online (Sandbox Code Playgroud)
如您所见,好的情况下工作正常,但坏的情况会导致段错误,这在大型项目中很难定位。
那么,有什么方法可以检查cast
, 并警告用户:
template <typename T>
class derived : public base {
T a;
using type = T;
/// of course this would not work, …
Run Code Online (Sandbox Code Playgroud) 我不明白为什么按回车键和按键盘上的 0 是一样的。
[int] $Choice = -1
$Count = 2
while ($Choice -lt 0 -or $Choice -gt $Count)
{
Write-Host "Input number"
$Choice = Read-Host
Write-Host "choice:"
Write-Host $Choice
}
Run Code Online (Sandbox Code Playgroud)
即使按回车,输出也会是 0。我希望用户明确输入 0。
我读过一个答案并偶然发现了下面的示例代码,这是 Elliott 从其他 SO 问题中得到的答案
我在尝试理解两件事(并了解如何调用此语法)时遇到问题:
#include <iostream>
template <typename ... T>
void Foo (T && ... multi_inputs)
{
int i = 0;
([&] (auto & input)
{
// Do things in your "loop" lambda
++i;
std::cout << "input " << i << " = " << input << std::endl;
} (multi_inputs), ...);
}
int main()
{
Foo(2, 3, 4u, (int64_t) 9, 'a', 2.3);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
两个问题,每个问题都有子问题:
(multi_inputs), ...
这相当于以下简化语法:
auto y = [&]() { }(); …
Run Code Online (Sandbox Code Playgroud) 我已经按照 MSDN 文档完成了所有操作,但我的函数仍然没有导出。 链接1 链接2 链接3
这是我所拥有的(2 个项目,DLL 和从 dll 导入的应用程序),如下所示(简短版本):
DLL函数.h
#prgma once
#ifdef COMPILE_DLL
#define EXPORT __declspec(dllexport)
#else
#define EXPORT __declspec(dllimport)
#endif // COMPILE_DLL
namespace wsl
{
EXPORT bool PointInTriangle(int x1, int y1, int x2, int y2, int x3, int y3, int x, int y);
}
Run Code Online (Sandbox Code Playgroud)
DLL函数.cpp
#include "functions.h"
namespace wsl
{
bool PointInTriangle(int x1, int y1, int x2, int y2, int x3, int y3, int x, int y)
{
// implementation...
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
DLL dllmain.cpp …
在下面的示例代码中,我试图检查函数参数是否是指针 std::is_pointer
如果只有一个参数它工作得很好,但是如何使它与更多参数一起工作,例如在参数包中?
#include <type_traits>
#include <iostream>
class Test
{
public:
template<typename... Params>
void f(Params... params);
template<typename T, typename... Params>
auto sum(T arg, Params... params)
{
return arg + sum(params...);
}
template<typename T>
auto sum(T arg)
{
return arg;
}
int member = 1;
};
template<typename... Params>
void Test::f(Params... params)
{
// ERROR: too many template arguments for std::is_pointer
if constexpr (std::is_pointer_v<Params...>)
member += sum(*params...);
else
member += sum(params...);
std::cout << member;
}
int main()
{
Test ts;
// both …
Run Code Online (Sandbox Code Playgroud) c++ ×6
powershell ×4
attributes ×2
templates ×2
analyzer ×1
boolean ×1
c++17 ×1
dllexport ×1
dllimport ×1
lambda ×1
namespaces ×1
polymorphism ×1
stl ×1
syntax ×1
type-traits ×1