RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / user-221228

Anton Shchyrov's questions

Martin Hope
Anton Shchyrov
Asked: 2022-07-20 16:43:25 +0000 UTC

对 REST 服务进行单元测试

  • 0

我正在 CDI 中编写 REST 服务。使用了helidon库。当这个服务启动时,它会从另一个服务接收部分配置。这是使用特殊的配置界面完成的org.eclipse.microprofile.config.spi.ConfigSource。实现该接口的类通过 ServiceLoader 加载,在构造函数中向远程 REST 服务发出请求,从它接收配置,然后将其提供给请求的人。

现在我需要为我的服务编写单元测试。问题是测试引擎在一开始就启动服务,在发生任何事件之前@BeforeAll,可以配置例如 Mockito 并覆盖此类的工作。该服务闯入一个远程服务,它没有找到它,这就是一切以异常结束的地方。

问题。如何解决这个问题呢?如果在测试阶段 ServiceLoader 根本不创建此配置类的实例,即使该选项也适合我。

java
  • 1 个回答
  • 10 Views
Martin Hope
Anton Shchyrov
Asked: 2022-07-17 07:55:26 +0000 UTC

生成jar文件的算法

  • 0

jar 文件有一个文件夹META-INF/services. 问题是谁输入信息以及如何输入?

现在,当我使用 maven 和 IDEA 构建同一个项目时,该文件夹中的几个文件包含不同的信息。结果,maven组装的项目对我不起作用。

maven 由 maven-shade-plugin 插件构建

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>3.2.4</version>
    <configuration>
        <transformers>
            <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                <mainClass>org.example.Loader</mainClass>
                <manifestEntries>
                    <Multi-Release>true</Multi-Release>
                </manifestEntries>
            </transformer>
        </transformers>
    </configuration>
    <executions>
        <execution>
            <id>make-assembly</id>
            <phase>package</phase>
            <goals>
                <goal>shade</goal>
            </goals>
        </execution>
    </executions>
</plugin>

java
  • 1 个回答
  • 10 Views
Martin Hope
Anton Shchyrov
Asked: 2022-07-15 21:33:11 +0000 UTC

IDEA 和 jar 中的不同程序行为

  • -1

有一个依赖项很大的项目(我使用 helidon)。从 IDEA 运行时,一切正常。通过mvn package和后续的组装项目java -jar myproject.jar,各种错误开始爬出来。据我了解,由于依赖项中的某些类没有进入生成的 jar(或者类加载器找不到它们,因为我似乎在 jar 文件中看到它们),因此出现了错误。

在指定不同的依赖项时,例如不同的版本或不同的包,会丢失不同的类。

例如,yaml 配置解析器现在没有加载。虽然文件YamlConfigParser.class在 jar 文件中

在 IDEA 中,我显然没有规定任何依赖项和设置。一切都在 pom.xml

问题是发生了什么,不同的行为从何而来?

顺便说一句,还是有构建jar,但是IDEA无法编译项目的情况。说没有找到课程。

我不知道这是否与主题有关,但是在构建maven时,出现一堆消息

[警告] 发现 module-info.class。着色会破坏其强大的封装。

构建由 maven-shade-plugin 完成

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>3.1.1</version>
            <configuration>
                <transformers>
                    <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                        <mainClass>org.example.Loader</mainClass>
                        <manifestEntries>
                            <Multi-Release>true</Multi-Release>
                        </manifestEntries>
                    </transformer>
                </transformers>
            </configuration>
            <executions>
                <execution>
                    <id>make-assembly</id>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.22.1</version>
        </plugin>
    </plugins>
</build>

如果 jar 文件是通过 Build Artifacts 在 IDEA 中创建的,那么一切正常。

比较了来自 IDEA 和 maven 的两个 jar 文件。课程是一样的。在 IDEA 的版本中,module-info.class 位于根目录,META-INF 文件夹的内容非常不同

java
  • 1 个回答
  • 10 Views
Martin Hope
Anton Shchyrov
Asked: 2022-07-05 23:56:37 +0000 UTC

SVG 到可绘制

  • 0

我正在运行时创建一个 SVG 图像。问题 - 如何将此 SVG 传递给接受对象的方法Drawable?

我的图片是一个三色饼图,但是每个扇区的角度是在运行时确定的,你不能把它打包到资源中。

如果 SVG 在这里干扰,那么我可以自己在画布上绘制它。但最终需要一个 Drawable

java
  • 1 个回答
  • 10 Views
Martin Hope
Anton Shchyrov
Asked: 2022-05-01 21:29:40 +0000 UTC

如何在 SVG 中计算笔画宽度

  • 0

你能告诉我如何在 SVG 中计算线条粗细吗?例如,我需要绘制一个 100x100 的正方形,线宽为 2 像素。同时,我画了坐标,我viewBox="0 0 10 10"应该指定 stroke-width什么?viewBox我无法更改值。

<svg version="1.0" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 10 10" width="100">
    <rect x="0" y="0" width="10" height="10" fill="none" stroke="red" stroke-width="2"/>
</svg>

并且成反比。Square 20x20 viewBox="0 0 100 100" 需要相同的 2 个像素

<svg version="1.0" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" width="20">
    <rect x="0" y="0" width="100" height="100" fill="none" stroke="red" stroke-width="2"/>
</svg>

вёрстка
  • 3 个回答
  • 10 Views
Martin Hope
Anton Shchyrov
Asked: 2022-03-29 01:59:32 +0000 UTC

在编译时更新资源

  • 0

我有一个应该集成 tlb 的 COM 服务器。我使用 cmake (ToolChain Visual Studio 2019) 和以下命令收集它

set(SOURCES ... myLib.idl myLib.rc)
add_executable(myLib.exe WIN32 ${SOURCES})

set(MIDL_OUTPUT
    ${CMAKE_CURRENT_LIST_DIR}/myLib_i.h
    ${CMAKE_CURRENT_LIST_DIR}/myLib_i.c
)

set(MIDL_FILE ${CMAKE_CURRENT_LIST_DIR}/myLib.idl)

set(TLB_NAME "${CMAKE_CURRENT_LIST_DIR}/myLib.tlb")
add_custom_command(
        OUTPUT ${MIDL_OUTPUT}
        COMMENT "midl /h myLib_i.h /iid myLib_i.c /tlb ${TLB_NAME} /proxy myLib_p.c ${MIDL_FILE} /env x64 /W1 /char signed /robust /nologo /Oicf /target NT60"
        COMMAND midl /h myLib_i.h /iid myLib_i.c /tlb ${TLB_NAME} /proxy myLib_p.c ${MIDL_FILE} /env x64 /W1 /char signed /robust /nologo /Oicf /target "NT60"
        WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}
        DEPENDS ${MIDL_FILE}
        MAIN_DEPENDENCY ${MIDL_FILE}
        VERBATIM
)
target_sources(myLib.exe PRIVATE ${MIDL_FILE} ${MIDL_OUTPUT})

并myLib.rc归档

1 TYPELIB "myLib.tlb"

问题:修改idl文件后,将上一版本的tlb文件添加为资源。直到我对项目进行一般构建

据我了解,问题在于编译不会更新myLib.rc.res. 如何强制它更新?

visual-c++
  • 1 个回答
  • 10 Views
Martin Hope
Anton Shchyrov
Asked: 2022-10-10 04:14:08 +0000 UTC

返回 VARIANT

  • 0

我正在编写一个 COM 服务器实现。其中一种方法必须返回 VARIANT。在 idl 我有这个声明

HRESULT _stdcall Method([out, retval] VARIANT * res);

它产生这样一个h文件

STDMETHOD(Method)(VARIANT * res);

问题:如何正确返回结果?我应该调用方法VariantInit(res)吗?还是调用者在做呢?如果是这样,我应该提前打电话VariantClear(res)吗?还是我总是得到一个指向未初始化的 VARIANT 的指针?

或者我应该有这样的代码?

if (res->vt != VT_EMPTY)
    VariantClear(res);
VariantInit(res);

然后必须将此 VARIANT 编组到另一个进程中。

c++
  • 1 个回答
  • 10 Views
Martin Hope
Anton Shchyrov
Asked: 2022-10-06 03:01:23 +0000 UTC

通用异常处理

  • 0

我有很多看起来像这样的方法

try {
   .....
} catch (const MyException & e) {
  return HandleError(e);
} catch (const std::exception & e) {
  return HandleError(e);
}

及处理功能

HRESULT HandleError(const std::exception & ex, HRESULT code) {
    SetErrorInfo(ex.what());
    return code;
}

HRESULT HandleError(const std::exception & ex) {
    return HandleError(ex, E_UNEXPECTED);
}

HRESULT HandleError(const MyException & ex) {
    return HandleError(ex, ex.code);
}

问题:是否可以将catch块减少到这种形式

try {
   .....
} catch (const std::exception & e) {
  return HandleError(e);
}

并且在函数本身中,已经决定了它是什么类型的异常以及如何处理它

HRESULT HandleError(const std::exception & ex) {
    if (ex is MyException)  // нужен оператор проверки класса-наследника
        return HandleError(ex, dynamic_cast<MyException)(ex).code);
    else
        return HandleError(ex, E_UNEXPECTED);
}

因为您需要检查来自不同库的几个不同异常,并且每个异常都有自己的错误代码。我不想插入相同捕获的梯子。我还没有看到宏。

c++
  • 2 个回答
  • 10 Views
Martin Hope
Anton Shchyrov
Asked: 2022-09-10 18:50:26 +0000 UTC

LEFT 和 INNER JOIN 的组合

  • 0

我有三张桌子t1,,,t2。t3每个表中的记录都可以链接到前一个。

CREATE TABLE t1 (
  id INT NOT NULL PRIMARY KEY
);

CREATE TABLE t2 (
  id INT NOT NULL PRIMARY KEY,
  t1_id INT
);

CREATE TABLE t3 (
  id INT NOT NULL PRIMARY KEY,
  t2_id INT
);

INSERT INTO t1 (id) VALUES (1);

INSERT INTO t2 (id, t1_id) VALUES (1, 1);
INSERT INTO t2 (id, t1_id) VALUES (2, NULL);

INSERT INTO t3 (id, t2_id) VALUES (1, 1);
INSERT INTO t3 (id, t2_id) VALUES (2, 2);
INSERT INTO t3 (id, t2_id) VALUES (3, NULL);

我需要在两个条件下从所有三个表中提取记录

  1. 记录t2可能不存在
  2. 如果t2有记录,那么只有那些引用t1

那些。应该是这样的样本

t3.id t2.id t1.id
一 一 一
3 无效的 无效的

我试过这个查询

SELECT
  *
FROM
  t3
  LEFT JOIN t2 ON (t3.t2_id = t2.id)
  JOIN t1 ON (t2.t1_id = t1.id)

但只有一个条目

t3.id t2.id t1.id
一 一 一

这个查询解决了我的问题

SELECT
  *
FROM
  t3
  LEFT JOIN t2 ON (t3.t2_id = t2.id)
  LEFT JOIN t1 ON (t2.t1_id = t1.id)
WHERE
  t2.id IS NULL OR
  t2.t1_id IS NOT NULL

但我不明白 JOIN 如何与 LEFT JOIN 结合使用?记录有什么用?或者是记录不能join到NULL的问题,什么join到什么的顺序没有定义?

链接到DB Fiddle

sql
  • 2 个回答
  • 10 Views
Martin Hope
Anton Shchyrov
Asked: 2022-08-30 20:12:52 +0000 UTC

支持两个项目分支

  • 1

有一个项目是由以前的程序员执行的,没有任何版本控制系统。现在这个项目正在交给我进行大规模的重构。同时,前任程序员将从事本项目目前的支持和发现的bug的修正。

如果我很幸运,那么在我发现每个错误之后,我都会得到一组新的资源。如果你不走运,那我就每两周得到一次。

问题:如何将收到的更改合并到我的项目分支中?

有一个想法,使两个分支old,new。自己领导分支new,并将产生的资源倒入分支old中。然后在两个提交之间形成一个差异old并将这个差异倒入new. 但如果我理解正确,只要其中一个分支中的行号发生变化,diff 就会停止滚动。还是我错了?

一般来说,我想知道如何解决这个问题?理想情况下在 svn 上。如果没有,我可以部署任何其他版本控制系统。

git
  • 1 个回答
  • 10 Views
Martin Hope
Anton Shchyrov
Asked: 2022-07-19 23:20:41 +0000 UTC

宏扩展为字符串

  • 2

这里描述了如何组织文件版本的自动增量。

特别是有这样的线路

#define VERSION_MAJOR 1
#define VERSION_MINOR 0
#define VERSION_PATCH 0
#define VERSION_BUILD 0

#define stringify(a) stringify_(a)
#define stringify_(a) #a

然后使用

VALUE "FileVersion", stringify(VERSION_MAJOR) "." stringify(VERSION_MINOR) "." stringify(VERSION_PATCH) "." stringify(VERSION_BUILD)

一切正常,但我不明白如何。宏在这里是如何工作的stringify?

如果你这样声明

#define stringify(a) #a

然后将该行写入 FileVersionVERSION_MAJOR.VERSION_MINOR.VERSION_PATCH.VERSION_BUILD

这是一种什么样的构造#a,为什么要嵌套在另一个宏中?

c
  • 2 个回答
  • 10 Views
Martin Hope
Anton Shchyrov
Asked: 2022-07-07 19:26:54 +0000 UTC

额外的窗口内存

  • 1

注册窗口类时,您可以设置一个参数,该参数cbWndExtra将显示为每个窗口分配多少额外内存

WNDCLASSA

cbWndExtra

类型:整数

在窗口实例之后分配的额外字节数。系统将字节初始化为零。如果应用程序使用 WNDCLASS 在资源文件中注册使用 CLASS 指令创建的对话框,则必须将此成员设置为 DLGWINDOWEXTRA。

在最后一段中,它说要访问此内存,您需要使用SetWindowLong

SetWindowLong 函数将一个值复制到额外的内存中。GetWindowLong 函数从额外内存中检索一个值。WNDCLASSEX 结构的 cbWndExtra 成员指定要分配的额外窗口内存量。不使用内存的应用程序必须将 cbWndExtra 初始化为零。

但是从描述 SetWindowLong本身来看,我不明白如何获得这段记忆。我所看到的只是内存已分配事实的声明

通过在与 RegisterClassEx 函数一起使用的 WNDCLASSEX 结构的 cbWndExtra 成员中指定一个非零值来保留额外的窗口内存。

那么如何获得指向该内存的指针呢?如果我理解正确,那么 GWL_USERDATA 在大小上是一块单独的内存,sizeof(LONG_PTR)它不依赖于cbWndExtra

c
  • 1 个回答
  • 10 Views
Martin Hope
Anton Shchyrov
Asked: 2022-06-30 17:50:26 +0000 UTC

如何处理队列中的所有消息?

  • 1

Delphi 有一种方法ProcessMessages可以抓取并处理当前在队列中的所有窗口消息。该方法的简化实现是

while PeekMessageA(Msg, 0, 0, 0, PM_REMOVE) do begin
  if Msg.Message <> WM_QUIT then begin
    TranslateMessage(Msg);
    DispatchMessage(Msg);
  end else begin
    DoneApplication;
    break;
  end;
end;

(+ VCL 特别需要的一些额外调用)。

可以从程序中的任何位置手动调用此方法。

问题:MFC中有类似的东西吗?

PS我知道调用这种方法的所有副作用,我只需要它来调试多线程应用程序

c++
  • 1 个回答
  • 10 Views
Martin Hope
Anton Shchyrov
Asked: 2022-06-26 00:11:16 +0000 UTC

重载运算符的细化

  • -1

有一个第三方库定义了一个Stream带有模板运算符重载的类<<

class Stream {
private:
    std::ostringstream _buffer;
public:
    template<typename T> 
    Stream& operator<<(const T& t) {
        _buffer << t;
        return *this;
   }
}

现在我想定义一个规则,用于将此类的对象写入我的类程序中的流。但是由于 Stream不是后继者ostream,我想写入任何流,然后在我的程序中定义一个模板函数

template <typename T>
T & operator<<(T & strm, const CMyClass & val) {
    ..........  // Запись полей объекта
    return strm;
}

但是现在当调用

Stream strm;
CMyClass obj;
strm << obj;

我在 IDE 中收到警告

重载运算符 '<<' 的使用不明确(操作数类型为 'Stream' 和 'CMyClass')
候选函数 [with T = CMyClass]
候选函数 [with T = Stream]

编译时出错

Stream.hh(112): error C2679: binary '<<': no operator found which采用'const T'类型的右手操作数(或没有可接受的转换)与[T=CMyClass]

那些。我的覆盖被忽略

问题:除了为每个流编写两个重载之外,还有什么方法可以解决这个问题?

Stream & operator<<(Stream & strm, const CMyClass & val);
std::ostream & operator<<(std::ostream & strm, const CMyClass & val);
c++
  • 1 个回答
  • 10 Views
Martin Hope
Anton Shchyrov
Asked: 2022-06-24 17:30:21 +0000 UTC

静态功能检测

  • 3

有一个宏

#define TEST printf("%p", this)

当您从常规方法调用它时 - 没问题

void CMyClass::Test() {
  TEST;
}

但是当你从静态方法调用它时

static void CMyClass::TestStatic() {
  TEST;
}

this您会收到一个错误,即未定义id 。这是合乎逻辑的。

问题:是否有可能以某种方式确定我们在一个静态函数中,并据此做出使用代码的决定?那些。像这样的东西

#define TEST \
  #if declared(this) \
    printf("%p", this) \
  #else \
    printf("%p", nullptr) \
  #endif

或者

#define TEST \
  if constexp (is_declared(this) \
    printf("%p", this); \
  else \
    printf("%p", nullptr)

宏用于记录通话

c++
  • 1 个回答
  • 10 Views
Martin Hope
Anton Shchyrov
Asked: 2022-06-16 20:35:41 +0000 UTC

获取班级名称

  • -1

我需要获取当前类的名称以进行日志记录。这是这里的建议


void MyNS::CMyClassImpl::Test() {
  std::cout << typeid(*this).name();
}

问题是对于班级

namespace MyNS {
    class ATL_NO_VTABLE CMyClassImpl :
            public ATL::CComObjectRoot,
            public ATL::CComCoClass<CMyClassImpl, &CLSID_CoMyClass>,
            public ATL::IDispatchImpl<IMyClass, &IID_IMyClass, &LIBID_rsMyLib, 1, 0>,
            public CComISupportErrorInfoImpl<&IID_IMyClass>
    {
        void Test();
    }
}

我得到一个字符串

class ATL::CComObject<class MyNS::CMyClassImpl>

两个问题:

  1. 为什么?
  2. 我想得到,CMyClassImpl或者至少MyNS::CMyClassImpl,然后设置解析器。

这一切都适用于 Visual Studio

更新

__PRETTY_FUNCTION__VS中没有宏。并__FUNCTION__返回MyNS::CMyClassImpl::MyMethod。如果没有其他选择,那么我将使用它

c++
  • 2 个回答
  • 10 Views
Martin Hope
Anton Shchyrov
Asked: 2022-06-11 20:10:52 +0000 UTC

Visual Studio 找不到库

  • 0

我在构建项目时遇到错误。

1>链接:致命错误LNK1104:无法打开文件'libEGL.lib'

指定库的路径

在此处输入图像描述

她躺在那里

D:\...Project\SDK\src\demo\windows_demo>dir ..\..\..\bin\16.0\x64\Debug\*.lib
 Том в устройстве D имеет метку Sources
 Серийный номер тома: 64FF-EA83

 Содержимое папки D:\Sources\Project\SDK\bin\16.0\x64\Debug

03.10.2017  12:37            15 814 libEGL.lib
03.10.2017  12:37           227 920 libGLESv2.lib

还缺少什么?

我查看了 ProcMon - 在几个程序文件路径和项目目录中搜索了该库。似乎附加库目录被简单地忽略了

平台和配置安装正确

工作室版

Microsoft Visual Studio 社区 2019
版本 16.10.1

在此处输入图像描述

visual-studio
  • 1 个回答
  • 10 Views
Martin Hope
Anton Shchyrov
Asked: 2022-06-04 01:04:54 +0000 UTC

属于多边形的点

  • 1

有一个代码可以检查一个点是否属于一个多边形

function IsInPoly(const ARegion: array of TPoint; const ASearchPoint: TPoint): Boolean;
var
  LPrevPoint, LCurPoint: TPoint;
  Li: Integer;
  DX, DY, StepX, StepY: Integer;
  Step: Double;
  Rotation: Double;
begin
  LPrevPoint := ARegion[0];
  Rotation := 0;
  for Li := 1 to Length(ARegion) - 1 do begin
    LCurPoint := ARegion[Li];
    DX := LCurPoint.X - LPrevPoint.X;
    DY := LCurPoint.Y - LPrevPoint.Y;
    StepX := LPrevPoint.X - ASearchPoint.X;
    StepY := LPrevPoint.Y - ASearchPoint.Y;
    if (StepX <> 0) or (StepY <> 0) then begin
      Step := (DX * StepY - DY * StepX) / (StepX * StepX + StepY * StepY);
      Rotation := Rotation + Step;
    end;
    LPrevPoint := LCurPoint;
  end;
  Result := (Abs(Rotation) > 5);
end;

帮助识别此算法。我在谷歌的文章中没有看到类似的描述。结果,我不明白代码在原理上是否有效?

在这里,据我了解(DX, DY),这是一个从上一个点到下一个点,以及(StepX, StepY)从所需点到上一个点的向量。什么是Step和Rotation?

алгоритм
  • 1 个回答
  • 10 Views
Martin Hope
Anton Shchyrov
Asked: 2022-05-28 14:41:37 +0000 UTC

将 SAFEARRAY 复制到矢量

  • 0

有SAFEARRAY。我需要将它的所有元素放在某种类型的向量中。

你做了什么:

SAFEARRAY * arr;
void * data;
SafeArrayAccessData(this->arr, &this->data);

template<typename T> HRESULT CVarArrayHelper::FillVector(std::vector<T> & vect) const {
    VARTYPE type;
    OLE_CHECK(SafeArrayGetVartype(this->arr, &type));
    switch (type) {
        case VT_I1:
            CreateVector<int8_t, T>(vect);
            break;
        case VT_I2:
            CreateVector<int16_t, T>(vect);
            break;
        ..............
        case VT_UI1:
            CreateVector<uint8_t, T>(vect);
            break;
        ..............
        case VT_R8:
            CreateVector<double, T>(vect);
            break;
        default:
            return E_INVALIDARG;
    }
    return S_OK;
}

template<typename T, typename R>
void CVarArrayHelper::CreateVector(std::vector<R> & vect) const {
    const T * data = static_cast<const T *>(this->data);
    if (this->len != 0) {
        vect.reserve(vect.size() + this->len);
        for (LONG i = 0; i < this->len; i++) {
            vect.push_back(static_cast<R>(*data));
            data++;
        }
    }
}

一切都适用于列出的类型。但我仍然需要添加 VT_VARIANT 类型。解决部分模板特化问题的想法

template<typename T, typename R>
R CVarArrayHelper::GetValue(const T & data) const {
    return static_cast<R>(data);
}

template<typename R>
R CVarArrayHelper::GetValue<VARIANT>(const VARIANT & data) const {
    // Здесь каст варианта к нужному типу
}

template<typename T, typename R>
void CVarArrayHelper::CreateVector(std::vector<R> & vect) const {
    const T * data = static_cast<const T *>(this->data);
    if (this->len != 0) {
        vect.reserve(vect.size() + this->len);
        for (LONG i = 0; i < this->len; i++) {
            vect.push_back(GetValue<R>(*data));
            data++;
        }
    }
}

但是方法的部分模板特化不起作用。现在有一个想法可以复制CreateVectorVARIANT的方法

template<typename R>
void CVarArrayHelper::CreateVectorVar(std::vector<R> & vect) const {
    const VARIANT * data = static_cast<const VARIANT *>(this->data);
    if (this->len != 0) {
        vect.reserve(vect.size() + this->len);
        for (LONG i = 0; i < this->len; i++) {
            vect.push_back(GetValueVar<R>(*data));
            data++;
        }
    }
}

嗯,挑战

case VT_VARIANT:
    CreateVectorVar<T>(vect);
    break;

但我不想重复代码。

你能想到什么吗?

更新

有这样的想法

template<typename T, typename R>
R CVarArrayHelper::GetValue(const T & data) const {
    if constexpr (std::is_same_v<T, VARIANT>)
        return GetValueVar<R>(data);
    else
        return static_cast<R>(data);
}

template<typename R>
R CVarArrayHelper::GetValueVar(const VARIANT & data) const {
    //
}

但是在线return GetValueVar<R>(data);我得到编译错误

错误 C2440:“正在初始化”:无法使用 [T=int8_t] 从“const T”转换为“const VARIANT &”

那些。编译器尝试为所有类型编译 GetValueVar 调用。但这似乎不if constexpr应该发生,不是吗?

c++
  • 1 个回答
  • 10 Views
Martin Hope
Anton Shchyrov
Asked: 2022-05-23 07:09:17 +0000 UTC

优化对象初始化

  • 0

有一个函数可以对对象进行常量引用

void test(const CMyObject & obj);

并且有两个函数,一个返回一个已经存在的对象

const CMyObject & getExists();

第二个构造一个新对象

CMyObject createNew();

问题:有什么办法可以更改此代码?

if (objExists)
  test(getExists());
else
  test(createNew());

这样只有一个函数调用test(),并且不复制对象的内容并且不创建空对象?

CMyObject obj;  // создали пустой объект
if (objExists)
  obj = getExists(); // скопировали содержимое
else
  obj = createNew(); // создали еще один объект и скопировали содержимое
test(obj);

test()我无法更改功能描述。

c++
  • 1 个回答
  • 10 Views

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5