小编Mad*_*ist的帖子

结合返回期货的功能

假设我有两个返回期货的函数:

std::future<T> foo(int);

std::future<U> bar(T const &);
Run Code Online (Sandbox Code Playgroud)

我想将这两个函数组合成一个带有intas参数并返回a 的函数std::future<U>.我应该怎么写这个函数?对于返回期货的函数,是否可以推广函数组合?

std::future<U> foobar1(int x)
{
  auto foo_x = foo(x);
  return bar(foo_x.get());
}
Run Code Online (Sandbox Code Playgroud)

此函数将阻塞,直到返回的未来foo完成,对吧?这显然不是我想要的.

std::future<U> foobar2(int x)
{
  return std::async([=]()
  {
    auto foo_x = foo(x);
    return bar(foo_x.get()).get();
  });
}
Run Code Online (Sandbox Code Playgroud)

如果只是为了让它变成一个新的未来,那么对于get()回归的未来感到愚蠢barstd::async

std::future<U> foobar3(int x)
{
  return foo(x).then([](std::future<T> f)
  {
    return bar(f.get()).get();
  };
}
Run Code Online (Sandbox Code Playgroud)

在这里,我必须再次呼吁get()将来回归,bar否则我会有一个future<future<U>>.这是正确的方法吗?

c++ future

9
推荐指数
1
解决办法
1009
查看次数

统一类型和非类型模板参数

我有一个类型特征,检查给定类型是否是给定类模板的实例:

template <template <typename...> class C, typename T>
struct check_is_instance_of : std::false_type { };

template <template <typename...> class C, typename ...Ts>
struct check_is_instance_of<C, C<Ts...>> : std::true_type { };

template <template <typename...> class C, typename T>
struct is_instance_of : check_is_instance_of<C, std::remove_cv_t<T>> { };
Run Code Online (Sandbox Code Playgroud)

不幸的是,这不适用于非类型模板参数,因为它们不会被可变参数模板参数"捕获",因此

is_instance_of<std::integral_constant, std::true_type>
Run Code Online (Sandbox Code Playgroud)

产生编译错误.有没有办法编写一个is_instance_of适用于任意数量的类型和非类型模板参数的实现?

c++ template-meta-programming

9
推荐指数
1
解决办法
332
查看次数

将ts ...解压缩到t0.a(),t0.b(),t1.a(),t1.b(),

我想以下列方式从另一个可变参数函数调用一个可变参数函数:

template <typename ...Ts>
void f(Ts const & ...) { /* ... */ }

template <typename ...Args>
void g(Args const & ...args)
{
  // shall call f(arg0.a(), arg0.b(), arg1.a(), arg1.b(), ...)
}
Run Code Online (Sandbox Code Playgroud)

我是通过以下方式完成的:

struct sentinel_t { };

template <typename Arg, typename ...Args>
void g_impl(Arg const & arg, Args const & ...args)
{
  g_impl(args..., arg.a(), arg.b());
}

template <typename ...Ts>
void g_impl(sentinel_t , Ts const & ...ts)
{
  f(ts...);
}

template <typename ...Args>
void g(Args const & ...args)
{
  g_impl(args..., sentinel_t{}); …
Run Code Online (Sandbox Code Playgroud)

c++ variadic-templates c++11

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

在元编程中强制执行不变量

我希望能够检查元程序中使用的类的不变量。我的第一个天真的方法是

template <int N>
struct digit
{
  static_assert((N >= 0) && (N < 10), "bad invariant");
};

using boom = digit<99>;
Run Code Online (Sandbox Code Playgroud)

然而,这编译没有任何问题。只有在构造非法类时才会触发静态断言。

添加额外的模板参数时是可能的:

#include <type_traits>

template <int N, 
          typename = typename std::enable_if<(N >= 0) && (N < 10)>::type>
struct digit;

using crash = digit<-7>;
Run Code Online (Sandbox Code Playgroud)

当我想将此技术应用于用作类型列表的类时:

#include <type_traits>

template <typename ...> struct are_integral;

template <typename T, typename ...Ts>
struct are_integral<T, Ts...>
{
  static const bool value = std::is_integral<T>::value &&
                            are_integral<Ts...>::value;
};

template <>
struct are_integral<> : std::true_type { };



template <typename …
Run Code Online (Sandbox Code Playgroud)

c++ template-meta-programming c++11

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

如何根据名称检测成员变量的存在和类型?

我知道如何编写一个可以在编译时检测给定类T是否具有给定类型的给定名称的成员的类,例如

#include <type_traits>

template <typename T, typename Type, bool = std::is_class<T>::value>
struct has_member_foo
{
private:
  template <Type T::*> struct helper;

  template <typename U>
  static std::false_type test(...);

  template <typename U>
  static std::true_type test(helper<&U::foo> *);

  typedef decltype(test<T>(nullptr)) testresult;
public:
  static const bool value = testresult::value;
};

template <typename T, typename Type>
struct has_member_foo<T, Type, false> : std::false_type { };

struct Has_Foo
{
  int foo;
};

struct Has_No_Foo
{
  int bar;
};

void test()
{
  static_assert(has_member_foo<Has_Foo, int>::value == true, ":(");
  static_assert(has_member_foo<Has_No_Foo, int>::value == …
Run Code Online (Sandbox Code Playgroud)

c++ template-meta-programming c++11

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

是std :: tuple需要使用空基类优化吗?

std::is_empty<std::tuple<Args...>>::value
Run Code Online (Sandbox Code Playgroud)

如果每个类型都Args为空,则返回true ?gcc 4.9中的快速测试表明情况确实如此,但标准是否需要?

c++

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