小编gnz*_*lbg的帖子

使用Concepts Lite为具有成员函数模板的类型指定概念

我正在尝试使用Concepts Lite来指定一个概念来约束具有成员函数模板的更高级的kinded类型.但是,我无法在技术规范教程中找到一个处理概念中模板化语句的子句.

这是怎么做到的?

示例:假设我HKT的成员函数模板具有更高的kinded类型F:

template<class T>
struct HKT {
  template<class U> // this looks like e.g. rebind in std::allocators
  auto F(U) -> HKT<U>;
};
Run Code Online (Sandbox Code Playgroud)

现在我想指定一个约束这些更高级的类型的概念:

template <template <class> class HKT, class T>
concept HKTWithTemplateMemberFunctionF {
  return requires(HKT<T> h) { // HKT<T> is a type, h is an object
    // HKT<T> needs to have a member function template that 
    // returns HTK<U> where the type U is to be deduced and
    // it …
Run Code Online (Sandbox Code Playgroud)

c++ higher-kinded-types c++-concepts

61
推荐指数
2
解决办法
1943
查看次数

使用boost或STL在C++中对压缩(锁定)容器进行排序

我想做什么:我想将2个,3个或N个向量锁定在一起,而不是将它们复制到元组中.也就是说,将冗长放在一边,例如:

vector<int>    v1 = {  1,   2,   3,   4,   5};
vector<double> v2 = { 11,  22,  33,  44,  55};
vector<long>   v3 = {111, 222, 333, 444, 555};

typedef tuple<int&,double&,long&> tup_t;
sort(zip(v1,v2,v3),[](tup_t t1, tup_t t2){ return t1.get<0>() > t2.get<0>(); });

for(auto& t : zip(v1,v2,v3))
  cout << t.get<0>() << " " << t.get<1>() << " " << t.get<2>() << endl;
Run Code Online (Sandbox Code Playgroud)

这应输出:

5 55 555
4 44 444
...
1 11 111
Run Code Online (Sandbox Code Playgroud)

我现在是怎么做的:我已经实现了自己的快速排序,我传递的第一个数组用于比较,排列应用于所有其他数组.我只是无法弄清楚如何重用std :: sort来解决我的问题(例如提取排列).

我试过的: boost :: zip_iterator …

c++ algorithm boost std c++11

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

我什么时候应该使用std :: bind?

每次我需要使用时std::bind,我最终都会使用lambda.那么我std::bind什么时候应该使用?我刚刚从一个代码库中删除它,我发现lambdas总是更简单,更清晰std::bind.是不是std::bind完全没必要?它不应该在将来被弃用吗?我std::bind什么时候应该更喜欢lambda函数?(必须有一个原因,它与lambda一起进入标准.)

我也注意到越来越多的人熟悉lambdas(所以他们知道lambdas做了什么).但是,很少有人熟悉std::bindstd::placeholders.

c++ lambda bind standard-library c++11

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

CMake - 删除单个翻译单元的编译标志

我想删除单个翻译单元的set compile标志.有没有办法做到这一点?(例如使用set_property?)

注意:compile-flag没有-fno-name否定(无论出于何种原因).

我试过了:

get_property(FLAGS TARGET target PROPERTY COMPILE_FLAGS)
string(REPLACE "-fname" "" FLAGS ${FLAGS})
set_property(TARGET target PROPERTY COMPILE_FLAGS ${FLAGS})
Run Code Online (Sandbox Code Playgroud)

没有运气.我想删除的属性是其中的一部分,CMAKE_CXX_FLAGS因此这不起作用.

c++ cmake

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

为什么numeric_limits :: min为int返回负值但是为float/double返回正值?

为什么 numeric_limits :: min返回int的负值,但是例如float和double的正值?

#include<iostream>
#include<limits>

using namespace std;

int main() {
  cout << "int: " << numeric_limits<int>::min() << " "
       << "float: " << numeric_limits<float>::min() << " "
       << "double: " << numeric_limits<double>::min() << "\n";
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

int: -2147483648 float: 1.17549e-38 double: 2.22507e-308
Run Code Online (Sandbox Code Playgroud)

从cppreference:

返回数值类型T表示的最小有限值.

对于具有非规范化的浮点类型,min返回最小正标准化值.请注意,此行为可能是意外的,尤其是与整数类型的min行为进行比较时.要查找没有小于它的值的值,请使用 numeric_limits::lowest.

min仅对有界类型和无界无符号类型有意义,也就是说,表示无限负值集的类型没有有意义的最小值.

c++ std numeric-limits

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

没有编译器挂钩,哪个<type_traits>无法实现?

C++ 11提供了标准<type_traits>.

没有编译器挂钩,哪些是不可能实现的?

  • 注1:编译器钩子我指的是任何非标准语言特征,例如__is_builtin....
  • 注2:它们中的很多都可以在没有钩子的情况下实现(参见 C++ Template Metaprogramming的第2章和/或Modern C++ Design的第2章).
  • 注3:前一个问题中的蹩脚答案引用了N2984,其中一些类型特征包含以下注释:被认为需要编译器支持(感谢sehe).

c++ type-traits c++11

26
推荐指数
2
解决办法
1428
查看次数

使用统一初始化语法从函数返回元组

以下代码使用clang(libc ++)编译,并使用gcc(libstdc ++)失败.为什么gcc(libstdc ++)抱怨初始化列表?我认为return参数使用统一初始化语法.

std::tuple<double,double> dummy() {
  return {2.0, 3.0};
}

int main() {   
  std::tuple<double,double> a = dummy();   
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

错误:第22行:从initializer\list转换为'std :: tuple'将使用显式构造函数'constexpr std :: tuple <_T1,_T2> :: tuple(_U1&\&,_ U2 &&)[with _U1 = double; _U2 =双倍; =无效 _T\1 =双倍; _T2 =双倍]'

注意: GCC(libstdc ++)(和clang(libc ++))接受

std::tuple<double,double> dummy {1.0, 2.0};
Run Code Online (Sandbox Code Playgroud)

是不是一样的情况?

更新:这是一个libc ++扩展,请参阅http://llvm.org/bugs/show_bug.cgi?id=15299,并由Howard Hinnant在下面回答.

c++ gcc tuples c++11

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

什么时候与VAO绑定什么?

我已经学习OpenGL三天了,我可以完成任务,但我觉得在不知道自己在做什么的情况下复制粘贴.我认真地思考我缺少什么时候恰好是基本的了解什么(VBO,属性,...)绑定到一个顶点数组对象(VAO),并没有发现明确将详细介绍这些方面的任何资源.

特别是,这些是我的一些问题.如果我创建一个VAO:

GLuint vao;
glGenVertexArrays(1, &vao);
Run Code Online (Sandbox Code Playgroud)

在绑定VAO之前,任何东西都可以绑定它吗?(如果我现在创建一个VBO,它是否绑定到VAO?)

glBindVertexArray(vao);
Run Code Online (Sandbox Code Playgroud)

绑定VAO后,如果我创建一个VBO:

GLuint vbo;
glGenBuffers(1, &vbo);
Run Code Online (Sandbox Code Playgroud)

是否与VAO绑定?或者它绑定它时会发生吗?

glBindVertexArray(vbo);
Run Code Online (Sandbox Code Playgroud)

或者也许当我复制一些东西时?

如果我得到属性位置:

att = glGetAttribLocation(program_id, "name");
Run Code Online (Sandbox Code Playgroud)

是否与VAO绑定?或者在启用它后会发生:

glEnableVertexAttribArray(att);
Run Code Online (Sandbox Code Playgroud)

......或者在设置之后:

glVertexAttribPointer(att, ...);
Run Code Online (Sandbox Code Playgroud)

我猜EBO的行为与VBO一样,所以我希望同样的"规则"适用.

制服应该像全局一样,所以它们不应该受到VAO的影响.

现在,关于解除绑定:

如果我将VBO"绑定"到VAO,然后取消绑定VBO,它是否会与VAO分离?

如果我有一个绑定到多个VAO的VBO,当我取消绑定VBO时会发生什么?

关于释放资源:

删除VBO后会发生什么?是否会从所有VAO中删除?或者他们仍然对VBO有"悬挂参考"?

关于节目:

IIUC我可以在程序之间重用VBO.但是,如果VAO绑定属性和VBO,并且属性采用程序参数,我可以在程序之间重用VAO吗?为什么属性会占用程序参数?

关于调试:

有没有办法漂亮打印OpenGL状态机?我想知道一种方法来了解已经链接的程序,哪些着色器,哪些VAO在哪里,哪些VBO绑定到哪些VAO,哪些属性被绑定到哪些VAO和VBO,它们是否被设置?他们启用了吗?有哪些制服......

关于绘图电话:

假设某人给了我一个VAO,我必须画它.有没有办法知道我是否应该调用glDrawArrays或glDrawElements?我能以某种方式从VAO查询这些信息吗?也许随着我的VBO的大小存储在那里?

c++ opengl

20
推荐指数
2
解决办法
4253
查看次数

如何将lambda的operator()声明为noreturn?

如何operator()将lambda声明为noreturn

Ideone接受以下代码:

#include <cstdlib>  
int main() {
    []() [[noreturn]] { std::exit(1); }();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Clang 3.5拒绝它:

error: 'noreturn' attribute cannot be applied to types
Run Code Online (Sandbox Code Playgroud)

你可以在godbolt中试试:http://goo.gl/vsuCsF

哪一个是对的?

更新:相关的标准部分似乎是5.1.2.5,7.6.3,7.6.4,但在阅读之后,我仍然不是100%明确的(i)正确的行为是什么,(ii)如何标记lambda的operator()为noreturn.

c++ lambda attributes c++11 noreturn

17
推荐指数
1
解决办法
1948
查看次数

如何检查给定呼叫站点的重载决策集

如何检查过载分辨率设置?

我在多个呼叫站点中使用了4个竞争功能.在一个调用站点中,我期望调用一个函数,但编译器会选择另一个函数.我不知道为什么/它不是微不足道的.要了解正在发生的事情,我正在使用enable_if/disable_if打开/关闭功能,但这实在是很慢/乏味/烦人.

所以我希望编译器告诉我"为什么?".也就是说,对于这个单一呼叫站点:

  • ADL发现的所有功能,
  • 重载决策集中的所有函数,
  • 从重载决策集中拒绝的所有函数以及它们被拒绝的原因,以及
  • 重载决策集中的函数行列以及它们的排名原因.

不需要有关访问控制的信息.

基本上我希望用一个#pragma或类似的(__builtin...)标记呼叫站点.但libclang也是一种选择.

我可以访问tip-of-trunk clang和gcc,但如果需要可以安装其他编译器/工具.

c++ debugging gcc clang overload-resolution

15
推荐指数
1
解决办法
736
查看次数