我正在尝试A在参数包中找到类型:
template <int I, typename A, typename B, typename ...C>
struct index_of
{
static constexpr int const value =
std::is_same<A, B>::value ? I : index_of<I + 1, A, C...>::value;
};
template <int I, typename A, typename B>
struct index_of<I, A, B>
{
static constexpr int const value =
std::is_same<A, B>::value ? I : -1;
};
Run Code Online (Sandbox Code Playgroud)
这似乎工作,但我无法消除nontype参数I,我想成为默认参数,但由于最后的参数包,不能这样做.如何消除/隐藏I,因此元功能变得更加用户友好?
默认的构造函数由C++编译器生成,用户无法控制它们.他们可以扔吗?是否可以指定noexcept何时声明?
以下代码编译得很好gcc.
struct A
{
A() = default;
};
struct B
{
B() noexcept = default;
};
int main()
{
A a;
B b;
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我想创建一个我可以用作模板参数的字符串文字.它将编译器抛入某种无限循环.有什么问题并修复?
template <char...> struct slit { };
template <typename ...A>
constexpr auto make_slit(char const* const s, A const ...args)
{
return *s ? make_slit(s + 1, *s, args...) : slit<args...>();
}
int main()
{
auto const tmp_(make_slit("slit"));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
强制性错误(带clang++ -std=c++1y):
t.cpp:4:16: fatal error: recursive template instantiation exceeded maximum depth of 256
constexpr auto make_slit(char const* const s, A const ...args)
^
t.cpp:6:15: note: in instantiation of function template specialization 'make_slit<char, char, char, char, char, char, char, …Run Code Online (Sandbox Code Playgroud) 的一个优点any了variant就是,一个不需要指定所有类型,它可能含有.我注意到,随着a类型的数量variant增加,人们倾向于any在某个时候切换,因为他们根本不再跟踪所有类型.我想之间的混合any,并variant有可能.一个可以存储" placeholder"(通过放置new)的any中aligned_storage,与在所计算的大小constexpr被存储,其可以最终功能或模板元函数,从最大的类型的样本,.另一方面,用户不需要指定any可能包含的所有类型.该any还可以扔在任何时候,如果用户将尝试存储的东西比大aligned_storage在那里.
这样的" variant_any"类是否存在?这个想法有一些固有的问题吗?
说我有这些声明:
using fp_type = void(*)();
using fp2_type = void(*)() noexcept;
Run Code Online (Sandbox Code Playgroud)
和
void func(){}
fp_type fp(func);
Run Code Online (Sandbox Code Playgroud)
演员fp2_type(fp)表现良好吗?反过来(将noexcept指定的函数指针强制转换为没有noexcept说明符的函数指针)?
我们知道,非捕获lambda仿函数可以在运行时转换为函数指针,但编译时间如何呢?也就是说,类似于下面的代码可能吗?请不要建议一个解决方法,比如将lambda仿函数作为函数参数传递,我想知道更多C++ 11标准在哪里/如何禁止它.
template <void(*fptr)()>
void f()
{
// do something
}
int main()
{
auto l([]{});
f<(void(*)())(decltype(l))>();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
强制性错误gcc-4.8:
c.cpp: In function 'int main()':
c.cpp:11:7: error: parse error in template argument list
f<(void(*)())(decltype(l))>();
^
c.cpp:11:36: error: statement cannot resolve address of overloaded function
f<(void(*)())(decltype(l))>();
^
Run Code Online (Sandbox Code Playgroud) 我的问题是:
现在lambda仿函数是C++的一部分,它们可以用来整理类的接口.lambda如何使用vs私有方法在C++中使用compare?unclutter类接口是否存在更好的替代方案?
所有非本地lua对象都存储在某个表中.从表中检索对象通常意味着首先进行密钥的哈希计算,然后检索相应的对象.我想避免哈希计算的额外步骤.
最简单的事情(曾经可能)将是:
lua_Object o(...some lua call...);
lua_pushobject(o);
Run Code Online (Sandbox Code Playgroud)
但是,如上所述,这是不可能的.那么,如何将lua对象(特别是大型表,重建速度很慢)存储然后快速存储到lua堆栈中?我知道注册表,但这只是另一个表,如果我从那里存储/检索,则不会避免哈希计算.
编辑:
一些细节:
lua包装器库的一个众所周知的问题是临时表问题.说我打电话:
control:camera():get_something_else()
Run Code Online (Sandbox Code Playgroud)
control带有CFunction的表(包装的C++对象)在哪里.camera每次调用该方法时,该方法都将返回一个表(另一个包装的C++对象).如果我们可以缓存这个表,那将是很好的,因此每次都不需要重新创建它,因为时间是关键的(出于性能原因我们使用C/C++).此外,我们不希望从另一个表中查找表,因为这意味着计算某个键的散列(比如包装的C++对象的实例转换为整数),以及其他查找成本.我的目标是最新lua版本5.2.
请原谅我的长篇文章,但我不能让这个程序工作,除非我指定-fpermissivegcc而不是在clang下.你能帮我解决这个例子吗?
namespace detail
{
template<typename T>
constexpr auto address(T&& t) ->
typename ::std::remove_reference<T>::type*
{
return &t;
}
template <typename FP, FP fp, class C, typename ...A>
struct S
{
static constexpr auto* l = false ? address(
[](C* const object) noexcept
{
return [object](A&& ...args) {
return (object->*fp)(::std::forward<A>(args)...);
};
}) :
nullptr
;
};
template <typename FP, FP fp, typename R, class C, typename ...A>
auto make_member_delegate(C* const object, R (C::* const)(A...)) ->
decltype((*S<FP, fp, C, A...>::l)(object))
{ …Run Code Online (Sandbox Code Playgroud) 如果我实现这样的C回调:
register_callback([](/*some args*/){/*some stuff*/});
Run Code Online (Sandbox Code Playgroud)
触发时我得到一个SIGSEGV,但如果我这样注册:
auto const f([](/*some args*/){/*some stuff*/});
register_callback(f);
Run Code Online (Sandbox Code Playgroud)
然后它工作正常.(对我来说)特别感兴趣的是地址消毒剂产生的堆栈跟踪:
ASAN:SIGSEGV
=================================================================
==22904==ERROR: AddressSanitizer: SEGV on unknown address 0x7f1582c54701 (pc 0x7f1582c54701 sp 0x7f1582c544a8 bp 0x7f1582c54510 T2)
#0 0x7f1582c54700 ([stack:22906]+0x7fc700)
AddressSanitizer can not provide additional info.
SUMMARY: AddressSanitizer: SEGV ??:0 ??
Run Code Online (Sandbox Code Playgroud)
它看起来好像函数指针指向堆栈.将lambda推入堆栈会将代码压入堆栈吗?由于我没有捕获任何函数指针的位置对我来说是一个谜.怎么了?没有使用优化标志.我不是在寻找解决方法.
编辑:显然'+'是一个工作示例的关键.我不知道为什么有必要.使用compile删除'+'和示例,但将使用clang-3.5和触发SIGSEGV gcc-4.9.
#include <curl/curl.h>
#include <ostream>
#include <iostream>
int main()
{
auto const curl(curl_easy_init());
if (curl)
{
curl_easy_setopt(curl, CURLOPT_URL, "cnn.com");
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
/*
auto const f([](char* const ptr, size_t const size, size_t const …Run Code Online (Sandbox Code Playgroud)