我想提供一个元素类型作为参数,以初始化指向未知类型元素的指针数组
就像是
void* init(type t)
void* array = malloc(sizeof_type(t)*10));
return array;
}
Run Code Online (Sandbox Code Playgroud)
然后打电话给
init(typeof(int))
Run Code Online (Sandbox Code Playgroud)
但是我无法弄清楚typeof的返回类型是什么。
我猜想sizeof_type可以使用
malloc((type) 0);
Run Code Online (Sandbox Code Playgroud)
提前致谢
PS:这对于矢量实现来说,如果有人可以指出我一些弹性代码,我也将非常感谢
当使用带有pImpl惯用语的智能指针时,如
struct Foo
{
private:
struct Impl;
boost::scoped_ptr<Impl> pImpl;
};
Run Code Online (Sandbox Code Playgroud)
显而易见的问题是Foo::Impl在Foo生成析构函数时不完整.
编译器通常在那里发出警告,并且boost::checked_delete由Boost智能指针在内部使用,静态断言该类Foo::Impl是完整的,如果不是这样则触发错误.
对于上面的编译示例,因此必须编写
struct Foo
{
~Foo();
private:
struct Impl;
boost::scoped_ptr<Impl> pImpl;
};
Run Code Online (Sandbox Code Playgroud)
并Foo::~Foo在实现文件中实现一个空,Foo::Impl完成的地方.这是智能指针优于裸指针的优势,因为我们不能无法实现析构函数.
到现在为止还挺好.但是当我尝试在类似的Bar类中引入模板构造函数时,我遇到了一种奇怪的行为(完整代码,请亲自尝试):
// File Bar.h
#ifndef BAR_H
#define BAR_H 1
#include <vector>
#include <boost/scoped_ptr.hpp>
struct Bar
{
template <typename I>
Bar(I begin, I end);
~Bar();
private:
struct Impl;
boost::scoped_ptr<Impl> pImpl;
void buildImpl(std::vector<double>&);
};
template <typename I>
Bar::Bar(I begin, I end)
{
std::vector<double> tmp(begin, …Run Code Online (Sandbox Code Playgroud) 简单的下面的代码
import Control.Monad
import Control.Monad.Random
psum :: (MonadRandom r) => Int -> r Double -> r Double
psum n x = fmap sum $ replicateM n x
Run Code Online (Sandbox Code Playgroud)
产生错误:
Could not deduce (Functor r) arising from a use of `fmap'
from the context (MonadRandom r)
Run Code Online (Sandbox Code Playgroud)
这对我来说很奇怪
class (Monad m) => MonadRandom m where ...
Run Code Online (Sandbox Code Playgroud)
在Control.Monad.Random.Class源文件中,由于monad是仿函数,GHC应该推断出r在我的上下文中是一个仿函数.我也尝试导入但Control.Monad.Random.Class没有成功.
手动添加Functor约束r作品,但我觉得这很难看.
我在这里错过了什么?
考虑CRTP的标准用法,对于某些表达式模板机制,它通过值保持其子节点:
template <typename T, typename>
struct Expr {};
template <typename T>
struct Cst : Expr<T, Cst<T>>
{
Cst(T value) : value(std::move(value)) {}
private:
T value;
};
template <typename T, typename L, typename R>
struct Add : Expr<T, Add<T, L, R>>
{
Add(L l, R r) : l(std::move(l)), r(std::move(r))
private:
L l; R r;
};
Run Code Online (Sandbox Code Playgroud)
等等
现在,在实现运算符时,我们必须通过引用传递,因为参数将被向下转换为正确的类型.问题是我发现自己实现了四个(!)版本operator+:
template <typename T, typename L, typename R>
Add<T, L, R> operator+(Expr<T, L>&& l, Expr<T, R>&& r)
{
return …Run Code Online (Sandbox Code Playgroud) AFAIK这是一个标准的"习语"
# define INT_MIN (-INT_MAX - 1)
# define INT_MAX 2147483647
Run Code Online (Sandbox Code Playgroud)
问题:为什么INT_MIN的定义不是-2147483648?
是否可以抛出一个实例std::bad_cast?根本的问题不是这样做是好还是不好,只是关于是否std::bad_cast有默认构造函数.
谢谢
我想实现以下天真(一阶)有限差分函数:
finite_difference :: Fractional a => a -> (a -> a) -> a -> a
finite_difference h f x = ((f $ x + h) - (f x)) / h
Run Code Online (Sandbox Code Playgroud)
正如您可能知道的那样,存在一个微妙的问题:必须确保(x + h)并且可以x用完全可表示的数字来区分.否则,结果有一个巨大的错误,由于(f $ x + h) - (f x)涉及灾难性取消的事实(并且必须仔细选择h,但这不是我的问题).
在C或C++中,问题可以像这样解决:
volatile double temp = x + h;
h = temp - x;
Run Code Online (Sandbox Code Playgroud)
并且volatile修饰符禁用与变量有关的任何优化temp,因此我们确信"聪明"的编译器不会优化这两行.
我还不知道Haskell还不知道如何解决这个问题.恐怕
let temp = x + h
hh = temp - x
in ((f …Run Code Online (Sandbox Code Playgroud) 在 C 或 bash 中,
我想知道如果可能的话,如何从 ssh 会话内部获取伪终端主机的文件描述符,该伪终端主机负责将输入输入到该会话的从站(pts)。
是否可以使用alphablend函数使图像的某些部分透明?
我可以创建一个包含RGB(0,0,255)特定区域的图像,当我绘制该图像时,该区域应该是透明的.这可能是AlphaBlend函数.是的,那么如何?
我正在阅读有关alphablend的内容,但我仍然不清楚.我想我们需要在创建图像时指定alphachannel.如果某个像素不存在alphachannel,那么该像素不能透明?
我在我的Linux机箱上测试了这个,它有gcc,编译得很好.
void myFunc(int* &input);
Run Code Online (Sandbox Code Playgroud)
编译没有错误.
在我的avr上,声明相同的功能:
void myFunc(int* &input);
Run Code Online (Sandbox Code Playgroud)
导致编译错误:
expected ';', ',' or ')' before '&' token
Run Code Online (Sandbox Code Playgroud)
linux上的gcc版本是4.6.3
avr(avr-gcc)的gcc版本是3.4.2
编写一个程序,将输入读取到#并报告序列ei发生的次数.
我有一个序列有点慌乱,如'ieei'其中编译器会进入第3 'e',但从来没有取'i'与getchar(),为什么,如果有人能够自己之前改善这一点,会是好?
char ch;
int sq=0;
while ((ch = getchar()) != '#')
{
if (ch == 'e')
{
ch = getchar();
if (ch == 'e')
ch = getchar();
if (ch == 'i')
sq++;
}
}
printf("Sequence occurs %d %s\n", sq, sq == 1 ? "time" : "times");
Run Code Online (Sandbox Code Playgroud)