小编use*_*108的帖子

在参数包中查找类型

我正在尝试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++ c++11

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

可以默认默认构造函数抛出?

默认的构造函数由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)

c++ c++11

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

无法创建字符串文字类型

我想创建一个我可以用作模板参数的字符串文字.它将编译器抛入某种无限循环.有什么问题并修复?

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)

c++ constexpr c++14

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

为什么在boost或Standard中没有"变体"?

的一个优点anyvariant就是,一个不需要指定所有类型,它可能含有.我注意到,随着a类型的数量variant增加,人们倾向于any在某个时候切换,因为他们根本不再跟踪所有类型.我想之间的混合any,并variant有可能.一个可以存储" placeholder"(通过放置new)的anyaligned_storage,与在所计算的大小constexpr被存储,其可以最终功能或模板元函数,从最大的类型的样本,.另一方面,用户不需要指定any可能包含的所有类型.该any还可以扔在任何时候,如果用户将尝试存储的东西比大aligned_storage在那里.

这样的" variant_any"类是否存在?这个想法有一些固有的问题吗?

c++ c++11

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

将函数指针强制转换为noexcept指定的函数指针

说我有这些声明:

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说明符的函数指针)?

c++ function-pointers noexcept

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

将lambda仿函数编译时转换为函数指针

我们知道,非捕获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)

c++ c++11

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

私有方法与C++中的Lambda相比

我的问题是:

使用lambda表达式与私有方法

现在lambda仿函数是C++的一部分,它们可以用来整理类的接口.lambda如何使用vs私有方法在C++中使用compare?unclutter类接口是否存在更好的替代方案?

c++ c++11

5
推荐指数
2
解决办法
1646
查看次数

从C/C++快速检索lua对象

所有非本地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.

c c++ lua

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

Lambda表达式作为常量表达式的未评估子表达式

请原谅我的长篇文章,但我不能让这个程序工作,除非我指定-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++ constexpr c++11

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

lambda对象+ c回调sigsegv

如果我实现这样的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)

c c++ lambda c++11

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

标签 统计

c++ ×10

c++11 ×7

c ×2

constexpr ×2

c++14 ×1

function-pointers ×1

lambda ×1

lua ×1

noexcept ×1