我正在尝试使用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) 我想做什么:我想将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 …
每次我需要使用时std::bind,我最终都会使用lambda.那么我std::bind什么时候应该使用?我刚刚从一个代码库中删除它,我发现lambdas总是更简单,更清晰std::bind.是不是std::bind完全没必要?它不应该在将来被弃用吗?我std::bind什么时候应该更喜欢lambda函数?(必须有一个原因,它与lambda一起进入标准.)
我也注意到越来越多的人熟悉lambdas(所以他们知道lambdas做了什么).但是,很少有人熟悉std::bind和std::placeholders.
我想删除单个翻译单元的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因此这不起作用.
为什么 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++ 11提供了标准<type_traits>.
没有编译器挂钩,哪些是不可能实现的?
__is_builtin....以下代码使用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在下面回答.
我已经学习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的大小存储在那里?
如何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.
如何检查过载分辨率设置?
我在多个呼叫站点中使用了4个竞争功能.在一个调用站点中,我期望调用一个函数,但编译器会选择另一个函数.我不知道为什么/它不是微不足道的.要了解正在发生的事情,我正在使用enable_if/disable_if打开/关闭功能,但这实在是很慢/乏味/烦人.
所以我希望编译器告诉我"为什么?".也就是说,对于这个单一呼叫站点:
不需要有关访问控制的信息.
基本上我希望用一个#pragma或类似的(__builtin...)标记呼叫站点.但libclang也是一种选择.
我可以访问tip-of-trunk clang和gcc,但如果需要可以安装其他编译器/工具.