小编Pol*_*mer的帖子

是否有一个原因,declval返回add_rvalue_reference而不是add_lvalue_reference

将类型更改为类型reference,允许访问类型的成员而不创建类型的实例.对于两者而言lvalue references,这似乎都是正确的rvalue references.

declval是用add_rvalue_reference 而不是 add_lvalue_reference,

  • 这只是一个惯例,
  • 或者是否有使用的例子add_rvalue_reference

编辑:我想我有点模糊,这些答案都非常好,但触及略有不同的点.建议使用两种不同的答案,Howard强调您可以选择您的类型具有哪种参考,使其add_rvalue_reference更加灵活.其他答案强调默认行为会自动选择更自然地反映输入类型的引用.我不知道该挑选什么!如果有人可以添加两个简单的例子,分别激励每个属性的需要,那么我会满意的.

c++ c++11

28
推荐指数
3
解决办法
2641
查看次数

使用模板重载函数类型

容器和函数都有一个共同的抽象.我在Haskell中学到了它,我正在尝试用C++实现它.

大多数C++程序员都熟悉std :: transform,粗略地说,从A类到B类的函数,你可以将类型A的容器转换为类型B的容器.

您可以以类似的方式转换函数,给定从A到B的函数foo,您可以将将Z转换为A的函数栏转换为函数foo.将Z带到B.实现很简单,它只是组合.

我想在容器和函数上定义一个函数fmap,以反映泛型编程的这种抽象.

容器很容易(我知道这不完全一般)

template <typename A, typename Func>
auto fmap(Func f, vector<A> in) {
  vector<decltype(f(in[0]))> out_terms{};
  for(auto vec : in)
    out_terms.push_back(f(vec));
  return out_terms;
}
Run Code Online (Sandbox Code Playgroud)

然而,功能的类似功能让我更加紧张.

template <typename FuncT, typename Func>
auto fmap(FuncT f, Func in) {
  return [f, in](auto x){
    return f(in(x));
  };
}
Run Code Online (Sandbox Code Playgroud)

虽然模板不会专门用于除可调用事物之外的任何东西,但我担心这会混淆重载决策.我想在模板参数上引入类型约束,以限制它们对函数类型的解析,以保持名称空间的清洁.我打算问如何做到这一点.

这种抽象非常通用,对于指向值的指针有相应的fmaps,我怀疑它也可能会发生冲突.

所以我认为我的问题是,我可以使用相同的模板级签名进行两种不同的模板实现吗?我几乎可以肯定答案是肯定的,但也许类似的事情可能会被伪造.如果没有,今天可以使用哪些工具来区分过载?特别是对于功能类型.

对我而言,这似乎是概念的教科书案例,尽管我不确定.

编辑:使用Boost是可以接受的,特别是SFINAE.我试图找到一个大多数程序员都熟悉的解决方案,尽可能方便,规范.我可以将fmap重命名为compose,但程序员必须知道将compose传递给接受fmap的模板函数.那将是不幸的,因为fmap在语义上是唯一的.

编辑2:如何使用它的一个简单示例.

template <typename T>
auto double_everything(T in){
  auto doublef = [](auto x){return 2*x;};
  return fmap(doublef, in);
}
Run Code Online (Sandbox Code Playgroud)

它将容器上的映射概括为映射到"容器之类"的东西.因此double_everything(vector<int> {1, 2, 3})返回一个向量,其元素加倍.但double_everything([](int x){ return x …

c++

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

是否可以在没有中间容器的情况下编写STL算法

我的问题部分是由这个问题推动的.

有没有办法在没有中间容器的情况下编写STL算法或用户编写的算法?答案可以使用boost中的工具,但假设组合算法是用户制作的,或者来自STL.

所以boost::adaptors::reversed不计算,因为反转算法处于提升状态.

c++

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

模板成员类的模板别名

我有以下模板

template<class F>
struct A{
  template<int N>
  struct B{
    using type = int;
  };
};
Run Code Online (Sandbox Code Playgroud)

但是,我想创建一个模板别名:

//doesn't compile.
template<class F, int N >
using alias_A = typename A<F>::B<N>::type;

GCC:
question.cpp:12:36: error: expected ';' before '::' token
 using alias_A = typename A<F>::B<N>::type;
                                    ^
question.cpp:12:36: error: 'type' in namespace '::' does not name a type
Run Code Online (Sandbox Code Playgroud)

调试时我发现:

//does compile
struct C{};
using alias_B = typename A<C>::B<0>::type;
Run Code Online (Sandbox Code Playgroud)

有人可以指出我做错了什么吗?我觉得我缺少明显的东西。

c++ c++11

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

键入函数从类型T到类型整数,其中sizeof(整数)> = sizeof(T)

我想要一个类型函数,它采用类型T并返回我满意的最小整数类型sizeof(I) >= sizeof(T).

有关如何处理此问题的任何想法,见解或评论?可以使用C++ 11,欢迎使用C++ 14.

对于好奇:我正在研究编程元素.我有一个函数,它从一个组(如int)映射到它自己.令x在函数的域中,并且通过将f应用于x多次来获得y.我想知道在得到y之前我有多少次将函数应用于x.该值称为距离,是一些整数.如果以k位指定组类型,则不同值的总数为pow(2,k).然后,元素之间可能的跳跃总数pow(2,k) - 1.因此,具有与组类型相同大小的整数类型足够大以容纳该距离函数可以返回的所有可能距离.

c++ c++11

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

什么可以证明lambda表达式中的参数传递给monad?

相对于鱼类操作者,Monads满足相关性.

(h >=> g) >=> f = h >=> ( g >=> f)
Run Code Online (Sandbox Code Playgroud)

这转换为bind(与lambda表达式)看起来像,

\a -> h a >>=(\b -> g b >>= \c -> f c) = 
\a ->(h a >>= \b -> g b)>>= \c -> f c
Run Code Online (Sandbox Code Playgroud)

这意味着下面的等式是明确的

( a -> h a >>= \b -> g b >>= \c -> f c ) =  h >=> g >=> f
Run Code Online (Sandbox Code Playgroud)

这是理解Monadic构图的好方法.

但是并非所有Monadic代码都将绑定变量保持为lambdas分开.例如,

[1,2] >>= \n -> ['a','b'] >>= \ch -> return (n,ch) = 
[(1,'a'),(1,'b'),(2,'a'),(2,'b')]
Run Code Online (Sandbox Code Playgroud)

返回中的"n"是从顶部lambda获得的.

更普遍,

a …
Run Code Online (Sandbox Code Playgroud)

monads haskell

0
推荐指数
1
解决办法
103
查看次数

是否存在具有基础堆分配的可选类型

在C++标准库中是否有一个类型,其语义与之相同optional,但其底层值存储在堆上?提升中有这样的类型吗?如果没有,您将如何实现此行为?

我想用RAII托管分支和值语义来构建树结构,如下所示:

struct tree{
    int val;
    heap_optional<tree> left;
    heap_optional<tree> right;
};
Run Code Online (Sandbox Code Playgroud)

编辑:

想法是可选的将在lvalue引用上具有赋值运算符.具有默认赋值的上述结构将按原样工作,无需额外实现.如果我使用std::unique_ptr它只有移动赋值,那么我将不得不在包含结构中实现所有赋值运算符和朋友.

c++

0
推荐指数
1
解决办法
115
查看次数

标签 统计

c++ ×6

c++11 ×3

haskell ×1

monads ×1