小编Ide*_*Hat的帖子

如何从右向左展开参数包

我试图通过递归地分配给一个类来展开参数包。我想从右到左执行此操作,因为某些操作确实处于待处理状态。

template <typename... T>
class Foo;

template <typename T>
class Foo<T> {/* base case implementation*/};

template <typename T, typename R, typename... Rs>
class Foo<T, Rs..., R> {
   private:
     Foo<T, Rs...> foo_;
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,以上让我:

类模板部分专业化包含无法推导的模板参数;
这种部分专业化将永远不会使用

这对我来说似乎很奇怪,我认为即使参数已切换顺序,Foo<T, Rs..., R>但仍应与模板专用化匹配。

我看过一些类似的问题:

特别是C ++模板的部分专业化:为什么我不能匹配可变参数模板中的最后一个类型?

但是,对我来说,最高票数(不被接受)的答案是没有意义的。当然,我知道模板参数包声明必须在声明的最后,但是我这样做是为了模板专门化。

我不确定为什么编译器无法映射Foo<T, Rs..., R>到初始模板声明,Foo<T...>并在那里执行参数包声明顺序。

该线程上的其他答案提供了如何提取最后一个值,但这仍然不允许您进行递归参数包展开,这是本文的重点。从右到左展开参数包是不可能的吗?

c++ c++11

13
推荐指数
1
解决办法
712
查看次数

在CMake中制作自定义中间件(改进C可编译测试器)

所以我们混合了C++/C项目.我想强制执行,即使所有源文件都是.cpp(C++编译),扩展名为"*.h"的源文件都是C可编译的(对于仅C++文件使用*.hpp).我想在编译时强制执行它,这样构建就会返回一个错误(与项目相关联,包含完整的行号和C错误和警告).在配置时运行(imho)实现有限的结果.

所以我目前有一个脚本可以做到这一点:

cmake_minimum_required (VERSION 2.8)

MACRO(MAKE_C_COMPILE_TESTER project_name target_sources cvar)

SET(CMAKE_CONFIGURABLE_FILE_CONTENT "")

FOREACH(src ${target_sources})
      MESSAGE(STATUS "TESTING src ${src}")
      GET_FILENAME_COMPONENT(SRC_EXT "${src}" EXT)
      MESSAGE(STATUS "SRC_EXT=${SRC_EXT}")
      if("${SRC_EXT}" STREQUAL ".h")
          set(CMAKE_CONFIGURABLE_FILE_CONTENT "${CMAKE_CONFIGURABLE_FILE_CONTENT}\n#include \"${src}\"")
      endif()
ENDFOREACH()

set(${cvar} "${${project_name}_BINARY_DIR}/${project_name}_CCompileTest.c")

configure_file("${CMAKE_ROOT}/Modules/CMakeConfigurableFile.in"
  "${${cvar}}"
  @ONLY)
set_source_files_properties("${cvar}" PROPERTIES GENERATED TRUE)

ENDMACRO()
Run Code Online (Sandbox Code Playgroud)

用法:

cmake_minimum_required (VERSION 2.8)

INCLUDE(MAKE_C_COMPILE_TESTER.cmake)

project(playlib)
add_definitions(-DPLAY_LIB_EXPORTS)

SET(${PROJECT_NAME}_SRC_LIST play_lib.h play_lib.hpp play_lib.cpp test.c testlib.h)

MAKE_C_COMPILE_TESTER(${PROJECT_NAME} "${${PROJECT_NAME}_SRC_LIST}" ${PROJECT_NAME}_CTESTER)

add_library(${PROJECT_NAME} SHARED ${${PROJECT_NAME}_SRC_LIST} ${${PROJECT_NAME}_CTESTER})
Run Code Online (Sandbox Code Playgroud)

这有效,但比我想要的更具侵略性.它需要多行,如果SRC_LIST不是一个单一的变量,那么你的工作量可能比你想要的多.此外,它添加了.c文件,这可能会让人困惑.

我更喜欢的是我将$ {project_name} _CCompileTest.c构建为一个中间件:它不作为源文件包含在目录中,可以作为单行添加到现有文件中.就像是:

SET(${PROJECT_NAME}_SRC_LIST play_lib.h play_lib.hpp play_lib.cpp test.c testlib.h)
add_library(${PROJECT_NAME} SHARED ${${PROJECT_NAME}_SRC_LIST})
MAKE_C_COMPILE_TESTER(${PROJECT_NAME})
Run Code Online (Sandbox Code Playgroud)

这样,它可以快速添加到所有现有项目以及未来项目中.我知道我可以使用提取源列表GET_TARGET_PROPERTIES(var ${project_name} SOURCES),我认为可以使用ADD_CUSTOM_COMMAND(TARGET $ …

c c++ cmake

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

这对const来说是不可变的吗?

基本上,我有以下情况.注意:void*用于表示任意数据,它在实际应用程序中强类型.

class A
{
public:
   //uses intermediate buffer but doesn't change outward behavior
   //intermediate buffer is expensive to fill
   void foo(void* input_data);

   //uses intermediate buffer and DOES explicitly change something internally
   //intermediate buffer is expensive to fill
   void bar(void* input_data);

   //if input_data hasn't changed since foo, we can totally reuse what happened in foo
   //I cannot check if the data is equal quickly, so I allow the user to pass in the
   //assertion (put the honerous on them, …
Run Code Online (Sandbox Code Playgroud)

c++ const mutable

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

为什么RHR功能不能超载?

我可以看到以下内容有用:

class A {
public:
   const vector<int>& vals() const {
       return val;
   }

   vector<int> vals() && {
       return std::move(val);
   }
private:
    vector<int> val;
}
Run Code Online (Sandbox Code Playgroud)

但是我用g ++得到了一个编译器错误:

error: ‘vector<int> A::vals() &&’ cannot be overloaded
Run Code Online (Sandbox Code Playgroud)

我认为您可以使用const函数执行相同类型的重载.这对于上述访问器来说不太有用,对操​​作员更有用.

c++ c++11

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

给定A和B类的两个CXXRecordDecl,是否有一种简单的方法可以查看A是否可以隐式转换为B?

X:尝试编写一个内部clang整洁工具,找到一个包含两种类型(A,B)的表达式然后如果const A&可以隐式转换为则抛出B

鉴于我可以找到两个CXXRecordDecl类,我可以轻松检测是否A可以隐式转换为B

我曾想过走过施工人员,但如果B提供铸造操作员,那将无法覆盖.我可以走过他们两个,但我确信我在这里缺少更多的案例(如外部定义的铸造操作员).基本上我想检测是否std::is_convertible<const B&, A>::value会返回true,每个编译器在验证转换时必须做的事情,但是人类很难写...

c++ clang-ast-matchers

7
推荐指数
0
解决办法
122
查看次数

删除和删除[]等效于基本数据类型

因此,在代码审查期间,我的一位同事使用了a double* d = new double[foo];然后调用了delete d.我告诉他们应该改变它delete [] d.他们表示编译器不需要基本数据类型.我不同意.

所以我想我会通过实验证明我的观点:

#define NUM_VALUES 10000
int main(int argc,char** argv)
{
  int i = 0;
  while (true)
  {
    std::cout << i << "|";
    double* d = new double[NUM_VALUES];
    std::cout << ((void*)d) << std::endl;
    for (int j = 0; j < NUM_VALUES; j++)
      d[j] = j;

    delete d;
    i++;
  }

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

不仅内存使用量不增长,而且每次都将d分配到同一个地方!(Visual Studio 2010).这是visual studio编译器的怪癖吗?或者这是标准的一部分?

c++ delete-operator

6
推荐指数
2
解决办法
283
查看次数

thead joinable-join是否有竞争条件?你怎么绕过它?

可以说我有以下课程

 class A
 {
 public:
    A()
    {
       my_thread=std::thread(std::bind(&A::foo, this));
    }
    ~A()
    {
       if (my_thread.joinable())
       {
          my_thread.join();
       }
    }
 private:
    std::thread my_thread;
    int foo();
 };
Run Code Online (Sandbox Code Playgroud)

基本上,如果我的线程在joinable和join调用之间完成,那么my_thread.join会永远等待吗?你怎么解决这个问题?

c++ stdthread

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

在cmake中从十进制转换为十六进制

Y:是否可以采用带有16位十进制的变量A并将其转换为10十六进制,反之亦然,在CMake中?

Google搜索只引导我进行以下操作:

http://public.kitware.com/pipermail/cmake/2008-September/024092.html

哪个不做转换.

X:我正在尝试使用"配置文件",将配置的值作为十进制读取,并在配置的头文件中将其输出为十六进制.

cmake

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

使用不与g ++一起使用的模板参数的typedef

以下代码在MVCC下编译但不是g ++,我不知道为什么.

template <typename T>
class A
{
public:
  template <typename C>
  class B
  {
  public:
    C* cptr;
  };

  typedef typename A<T>::B<T> Ttype;
};

int main(int argc,char** argv)
{
  A<int>::Ttype d;
  d.cptr = 0;
}
Run Code Online (Sandbox Code Playgroud)

用g ++,你得到

error: 'typename A<T>::B name template<class T> template<class C> class A<T>::B', which is not a type
Run Code Online (Sandbox Code Playgroud)

我正在使用-std = c ++ 11进行编译

c++ c++11

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

路径的 CMake 命令是相等的

是否有 CMake 命令在且仅当两个路径指向同一位置时返回 true(即使路径不是逐字相等的字符串)?

就像是

set(x ../foo)
set(y C:/cmaketest/foo)
if (x PATHEQUAL y)
{
   message(status "YAY")
}
Run Code Online (Sandbox Code Playgroud)

c++ cmake

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