小编Nik*_*iou的帖子

C++ 关系运算符生成器

定义<运算符后,您就可以估计其余关系运算符的行为方式。我正在尝试为我的课程实现一种方法。

我想要的是仅定义<和其余的运算符隐式默认。到目前为止我所得到的是这个设计,我将在下面进一步详细说明:

template<typename T>
struct relational
{
    friend bool operator> (T const &lhs, T const &rhs) { return rhs < lhs; }
    friend bool operator==(T const &lhs, T const &rhs) { return !(lhs < rhs || lhs > rhs); }
    friend bool operator!=(T const &lhs, T const &rhs) { return !(rhs == lhs); }
    friend bool operator<=(T const &lhs, T const &rhs) { return !(rhs < lhs); }
    friend bool operator>=(T const &lhs, T const &rhs) …
Run Code Online (Sandbox Code Playgroud)

c++ templates

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

从对象中获取价值

我想得到一个对象的价值(标题是这样的扰流板).

该对象可以是指针或不是.我正在寻找一个STL函数,它将成为"反转对应物"std::decay

到目前为止我看到的是这样的:

template<typename T>
typename std::enable_if<std::is_pointer<T>::value, 
typename std::add_reference<typename std::remove_pointer<T>::type>::type>::type 
deref(T val) 
{ return *val; } // lets call it the * policy

template<typename T>
typename std::enable_if<!std::is_pointer<T>::value, 
typename std::add_reference<T>::type>::type 
deref(T& val) 
{ return val; } // lets call it the plain policy
Run Code Online (Sandbox Code Playgroud)

当然,这些是在类模板中使用的,其中T是一个参数.我故意避免使用decltype和朋友在C++ 03中实现可实现的东西:(

有更好,更明智的方式吗?这个解决方案会"缩放"到C++ 11 &&吗?

c++

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

内联函数模板特化

以下代码位于.h文件中(包含保护)

template<typename T1, typename T2> // a
void func(T1 const &t1, T2 const &t2)
{
    std::cout << "\nbase template"; 
}

template<> // b
inline void func<int, int>(int const &t1, int const &t2)
{
    std::cout << "\nspecialization for integers";
}
Run Code Online (Sandbox Code Playgroud)

从(b)中删除inline关键字时,以下代码(从包含.h的.cpp调用)将无法编译

func<int, int>(1, 2);
Run Code Online (Sandbox Code Playgroud)

发出链接器错误"错误LNK2005:"void __cdecl func(int const&,int const&)"(?? $ func @HH @@ YAXABH0 @ Z)已在ConsoleApplication1.obj中定义"

为什么会这样?

编辑:

因为它们是定义(由Luchian Grigore回答),显式特化是否意味着显式实例化或者这个编译器是否具体?

c++

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

带有(死)简单C程序的Bug

有人可以发现以下程序的问题是什么,它不会像预期的那样打印数组的数字

#include<stdio.h>

#define TOTAL_ELEMENTS (sizeof(array) / sizeof(array[0]))
int array[] = {23,34,12,17,204,99,16};

int main()
{
    int d;
    for(d=-1;d <= (TOTAL_ELEMENTS-2);d++)
        printf("%d\n",array[d+1]);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c

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

使用r值refs重载,类模板的构造函数

虽然最初似乎工作,当通过制造商函数调用(具有模板参数推导)时,存在两个重载,T const&一个带有T&& 中断和一个带有中断编译:

#include <iostream>
#include <utility>
#include <functional>

using namespace std;

// -----------------------------------------------
template<typename T, typename F>
struct Test
{
    T m_resource;
    F m_deleter; 

    Test(T&& resource, F&& deleter) 
    : m_resource(move(resource)), m_deleter(move(deleter))
    {
    }
    Test(T const& resource, F const& deleter) 
    : m_resource(resource), m_deleter(deleter)
    {
    }
};
// -----------------------------------------------

// -----------------------------------------------
template<typename T, typename F>
Test<T, F> test(T&& t, F&& f)
{
    return Test<T, F>(move(t), move(f));
}
template<typename T, typename F>
Test<T, F> …
Run Code Online (Sandbox Code Playgroud)

c++ c++11

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

std :: uncaught_exception如何工作?

介绍

有关于使用和理性的帖子文章std::uncaught_exception.

功能提供的功能归结为

std :: uncaught_exception检测堆栈展开当前是否正在进行中.

Q

在搜索其定义时,我看到的是对DLL的调用

_CRTIMP2_PURE bool __CLRCALL_PURE_OR_CDECL uncaught_exception();
Run Code Online (Sandbox Code Playgroud)

如何实现程序中的这种内省水平?这是仅仅通过c ++或编译器/汇编魔法实现的东西必须发挥作用吗?

c++ c++11

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

如何将指针初始化为空

有三种方法(我知道)来初始化指向空值的指针:

1) 值初始化

T a = T(); // T is a pointer type
T a{};     // brace initializers don't suffer from the most vexing parse
Run Code Online (Sandbox Code Playgroud)

即使 atypedef是必需的,这种形式也可以在非通用代码中得到满足,例如

typedef int* ip; 
int *p = ip();
Run Code Online (Sandbox Code Playgroud)

2)nullptr手动设置

int *p = nullptr;
Run Code Online (Sandbox Code Playgroud)

3) 设置为可隐式转换为任何指针类型的有效空指针常量

int *p = NULL;
Run Code Online (Sandbox Code Playgroud)
  • 每种方法的优缺点是什么?

  • 是否存在每种方法都被认为是最合适的用例?

c++ c++11

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

C++ 对象的动态大小

如何确定对象的运行时大小?

我们不是在谈论类型大小,而是在执行过程中可能发生变化的对象的实际大小,例如:

vector<int> v;
auto a = MagicSizeF(v); // magic size function
v.push_back(2);
v.push_back(2);
// this should hold - ok there's small consainer optimizations and initial 
// vector capacity and implementation details, but you get what I mean
assert(MagicSizeF(v) > a); 
Run Code Online (Sandbox Code Playgroud)

在向量的情况下,它可以这样实现:

template<typename T>
auto MagicSizeF(vector<T> const& v) { 
    return v.size()*sizeof(T); // or v.capacity() to be strict
    // other implementation details memory consumers could be added
}
Run Code Online (Sandbox Code Playgroud)

但是对于任意类型的对象,是否有标准/通用方法来执行此操作?是否需要 ABI 来绕过所有实现细节?

c++ c++11 c++14

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

反向"hg update --clean"

标题中描述的命令是否可逆?

我尝试搜索日志(使用hg日志)并剥离相应的变更集,但没有为此命令发出日志.

version-control mercurial

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

确定(c ++)迭代器是否是反向的

我想要一种机制来在编译时确定迭代器是否是反向的.

迭代器特性只能帮助迭代器类型的类别,我需要的是以下几行:

template<typename IterType>
struct IsReverseIterator
{
    enum { Yes = /* Implementation of the mechanism */ };
}
Run Code Online (Sandbox Code Playgroud)

我有一个解决方案,虽然有一个小缺点,但也必须提供容器类型:

typedef char     TrueT;
typedef struct { TrueT _[2]; } FalseT;

template<typename Cont> TrueT  IsReverseIterator(typename Cont::const_reverse_iterator);    
template<typename Cont> FalseT IsReverseIterator(...);
Run Code Online (Sandbox Code Playgroud)

它明显使用SFINAE,可以这样使用:

std::vector<int> v;

std::cout << (sizeof(IsReverseIterator<std::vector<int>>(v.begin())) ==  sizeof(TrueT)) << std::endl;
std::cout << (sizeof(IsReverseIterator<std::vector<int>>(v.rbegin())) ==  sizeof(TrueT)) << std::endl;    
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

编辑

要解释我正在搜索的内容,请参考以下代码

template<typename Cont, typename It>
bool points_to_last_element(Cont const &container, It iter)
{
    return iter == container.rend(); …
Run Code Online (Sandbox Code Playgroud)

c++ templates

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

用 C++ 宏替换文本

宏通常用于文本替换。就我而言,我需要有条件地清除一些关键字,以便在没有特定功能的编译器中进行编译。

具体来说,我一直在研究这个片段来自的cpp11 范围

template <typename C>
struct has_size {
    template <typename T>
    static constexpr auto check(T*) -> // problem in VS2013
        typename std::is_integral<
            decltype(std::declval<T const>().size())>::type;
// .. some more stuff
};
Run Code Online (Sandbox Code Playgroud)

我提供这个作为产生问题的例子。在上面的代码中,我最终做了

template <typename T>
static 
#if COMPILE_WITH_GCC_NEW_ENOUGH
    constexpr 
#endif
auto check(T*) -> 
Run Code Online (Sandbox Code Playgroud)

因为还有其他部分constexpr需要替换const才能编译。

我要问的是一种说法,例如

#define Constexpr ?????????
Run Code Online (Sandbox Code Playgroud)

这样它就会constexpr在 gcc 编译中被替换,而在 VS 编译中没有文本内容

c++ macros

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

范围是否涉及2.x和3.x中的急切或懒惰评估?

我正在查看该range功能,在线搜索显示(编辑:在2.x),它是热切评估

>>> range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Run Code Online (Sandbox Code Playgroud)

但是当我在我的本地Python3.3解释器中尝试下面的代码时

a = range(10)
print(a)
Run Code Online (Sandbox Code Playgroud)

我得到一个输出

range(0, 10)
Run Code Online (Sandbox Code Playgroud)

这是我对懒惰评估函数的期望,是什么情况?

注意:在Python2.7中,它始终表现为热切评估.

python range python-2.x lazy-evaluation python-3.x

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

什么是更快:检查空指针或调用空函数?

我正在建立一个系统,我必须多次调用一些命令,具体取决于用户输入,例如

void handle(int MouseInput)
{
    switch(MouseInput)
    {
    case Move:  
        ActionMove->execute(); 
        // ...
    case BtnUp: 
        ActionBtnUp->execute(); 
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

然而,由于系统是可参数化的,我并不总是拥有例如actionMove命令对象(有时我在Move上什么都不做).

什么更快:

我要问的是什么是更大的开销,跳转到一个什么都不做的函数的成本(也许编译器很容易优化它)或者每次检查一个空指针?

注意我现在只能测试小规模,看不出任何差异.如果是这种情况,我想知道.

c++

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