相关疑难解决方法(0)

在宣布其他成员时,您可以使用一个成员的大小吗?

这是合法的C++吗?

struct foo
{
  int a[100];
  int b[sizeof(a) / sizeof(a[0])];
};
Run Code Online (Sandbox Code Playgroud)

GCC 4.6接受它,但MSVC 2012没有.看起来它对我来说应该没问题,但谷歌搜索没有帮助,我不知道在标准中的哪个位置.

MSVC 2012提供以下输出:

error C2327: 'foo::a' : is not a type name, static, or enumerator
error C2065: 'a' : undeclared identifier
error C2070: ''unknown-type'': illegal sizeof operand
warning C4200: nonstandard extension used : zero-sized array in struct/union
Run Code Online (Sandbox Code Playgroud)

c++

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

C++确定类是否具有可比性

我或多或少是Java程序员,所以这可能是一个愚蠢的问题,但我找不到任何简单的解决方案.

我在C++中有这样的类:

template<class T> class Node {...}
Run Code Online (Sandbox Code Playgroud)

我需要T才能具有可比性 - 至少要定义== <>运算符.有没有简单的方法来做到这一点 - 或者最佳做法是什么?在Java中,它将是这样的:

public class Node<T extends Comparable> { ... }
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助!

c++ generics templates comparable

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

为什么这个代码快速的char*?

Sutter在1:15:26的演讲中,它呈现了如下代码,

class employee{
 std::string name_;

public:
template<class String, class=
 std::enable_if_t< !std::is_same<std::decay_t<String>, std::string>::value > >
void set_name(String && name)
   noexcept(std::isnothrow_assignable<std::string &, String>::value)
  {
    name_ = std::forward<String>(name);
  }
}
Run Code Online (Sandbox Code Playgroud)

我知道std::forward如果name是左值,name_将如何工作,将得到复制构造; 如果name是右值,name_将构造移动.但是在幻灯片中它还说Optimized to steal from rvalues (and more),还有什么呢?

后来它表明这个代码似乎是所有四个实现中最快的,特别是因为char *,任何人都有耐心去理解这些代码并解释什么是更优化以及为什么它是最快的,特别是在这种情况下char *

c++ c++11

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

是否可以构建一个惰性条件元函数

假设我想用来std::conditional确定一个类型,如果类型是一个vector<...>返回将是a vector<...>::size_type,如果不是,它将是int.(只是一个例子).

一种天真的使用方式std::conditional:

template<class V> struct is_vector : std::false_type{};
template<class T> struct is_vector<std::vector<T>> : std::true_type{};

template<class C>
using my_size_type = typename std::conditional<
    not is_vector<C>::value, 
    int, 
    C::size_type // note that this line only makes sense when condition is false
>::type;
Run Code Online (Sandbox Code Playgroud)

但是这会失败,因为如果C是a double,double::size_type则会给出错误,即使那是第二个错误选项的评估.

所以,我很想知道是否存在一种lazy_conditional未评估错误(或第二个错误)语句的情况.

我在这里找到了一些东西:https://stackoverflow.com/a/5317659/225186但我不知道如何使用它我的例子.


请注意,我知道如何在不使用的情况下获得相同的结果std::conditional:

template<class V> struct my_size_type{typedef int type;};
template<class T> struct my_size_type<std::vector<T>>{typedef std::vector<T>::size_type type;};
Run Code Online (Sandbox Code Playgroud)

问题是,是否存在lazy_conditional …

c++ conditional templates short-circuiting c++11

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

表达式是在decltype中执行,还是只是检查验证?

通过使用Expression SFINAE,您可以检测是否支持某些操作员操作.

例如,

template <class T>
auto f(T& t, size_t n) -> decltype(t.reserve(n), void())
 { t.reserve(n); }
Run Code Online (Sandbox Code Playgroud)

我的问题是t.reserve(n)内部decltype被执行与否?

如果是,这是否意味着t.reserve(n)执行了两次,一次在内部decltype,另一次在函数体内?

如果没有,是否只是在编译期间检查验证?但是为什么它没有被执行,我认为逗号分隔表达式列表中的所有表达式都将被执行.

c++ templates sfinae c++11

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