相关疑难解决方法(0)

为什么要始终启用编译器警告?

我经常听到,在编译C和C ++程序时,我应该“始终启用编译器警告”。为什么这是必要的?我怎么做?

有时我也听说我应该“将警告视为错误”。我是不是该?我怎么做?

c c++ warnings c++-faq compiler-warnings

292
推荐指数
15
解决办法
3万
查看次数

C++和Java中"泛型"类型之间有什么区别?

Java有泛型,C++提供了一个非常强大的编程模型template.那么,C++和Java泛型有什么区别?

c++ java generics language-features templates

150
推荐指数
6
解决办法
9万
查看次数

C++的隐藏功能?

当涉及到"问题线"的"隐藏特征"时,没有C++的爱吗?想我会把它扔出去.C++的一些隐藏功能是什么?

c++ hidden-features

114
推荐指数
38
解决办法
8万
查看次数

如何在C++中编写可维护,快速,编译时的位掩码?

我有一些或多或少像这样的代码:

#include <bitset>

enum Flags { A = 1, B = 2, C = 3, D = 5,
             E = 8, F = 13, G = 21, H,
             I, J, K, L, M, N, O };

void apply_known_mask(std::bitset<64> &bits) {
    const Flags important_bits[] = { B, D, E, H, K, M, L, O };
    std::remove_reference<decltype(bits)>::type mask{};
    for (const auto& bit : important_bits) {
        mask.set(bit);
    }

    bits &= mask;
}
Run Code Online (Sandbox Code Playgroud)

Clang> = 3.6做聪明的事情并将其编译为单个and指令(然后在其他地方内联):

apply_known_mask(std::bitset<64ul>&):  # @apply_known_mask(std::bitset<64ul>&)
        and     qword …
Run Code Online (Sandbox Code Playgroud)

c++ bit-manipulation c++11

113
推荐指数
5
解决办法
7963
查看次数

我们可以有递归宏吗?

我想知道我们是否可以在C/C++中使用递归宏?如果是,请提供示例.

第二件事:为什么我无法执行以下代码?我在做什么错?是因为递归宏吗?

# define pr(n) ((n==1)? 1 : pr(n-1))
void main ()
{
    int a=5;
    cout<<"result: "<< pr(5) <<endl;
    getch();
}
Run Code Online (Sandbox Code Playgroud)

c c++ macros c-preprocessor

50
推荐指数
4
解决办法
4万
查看次数

使用C++的高级类型

这个问题适用于了解Haskell(或任何其他支持高级类型的函数语言)和C++的人...

是否可以使用C++模板对更高级的kinded类型进行建模?如果是,那怎么样?

编辑:

演示文稿由托尼·莫里斯:

高阶多态性:

  • Java和C#等语言具有一阶多态性,因为它们允许我们对类型进行抽象.例如, List<A>可以有一个reverse适用于任何元素类型(A)的函数 .

  • 更实用的编程语言和类型系统允许我们在类型构造函数上进行抽象.

  • 此功能称为高阶(或更高阶)多态.

示例:

伪Java,发明了高阶多态性的符号

interface Transformer<X, Y> {
  Y transform(X x);
}

interface Monad<M> { // M :: * -> *
  <A> M<A> pure(A a);
  <A, B> M<B> bind(Transformer<A, M<B>> t, M<A> a);
}
Run Code Online (Sandbox Code Playgroud)

c++ templates haskell higher-kinded-types

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

基于constexpr的计算图灵完成了吗?

我们知道C++模板元编程是Turing完整的,但预处理器元编程却不是.

C++ 11为我们提供了一种新形式的元编程:constexpr函数的计算.这种计算形式是图灵完备吗?我在想,因为在constexpr函数中允许递归和条件运算符(?:),它会是,但我希望有更多专业知识的人来确认.

c++ metaprogramming computation-theory constexpr c++11

42
推荐指数
2
解决办法
2715
查看次数

当人们说C++有"不可判断的语法"时,人们的意思是什么?

人们说这话时意味着什么?对程序员和编译器有什么影响?

c++ compiler-construction

34
推荐指数
3
解决办法
9313
查看次数

constexpr连接两个或多个char字符串

我正在尝试创建一个constexpr函数,它将连接Xeo的以下答案来连接任意数量的char数组,它连接两个char数组.

/sf/answers/930612091/

#include <array>

template<unsigned... Is> struct seq{};
template<unsigned N, unsigned... Is>
struct gen_seq : gen_seq<N-1, N-1, Is...>{};
template<unsigned... Is>
struct gen_seq<0, Is...> : seq<Is...>{};

template<unsigned N1, unsigned... I1, unsigned N2, unsigned... I2>
constexpr std::array<char const, N1+N2-1> concat(char const (&a1)[N1], char const (&a2)[N2], seq<I1...>, seq<I2...>){
  return {{ a1[I1]..., a2[I2]... }};
}

template<unsigned N1, unsigned N2>
constexpr std::array<char const, N1+N2-1> concat(char const (&a1)[N1], char const (&a2)[N2]){
  return concat(a1, a2, gen_seq<N1-1>{}, gen_seq<N2>{});
}
Run Code Online (Sandbox Code Playgroud)

我到目前为止的尝试:

#include <iostream>
#include <array>

template<unsigned... Is> struct seq{}; …
Run Code Online (Sandbox Code Playgroud)

c++ templates constexpr c++11

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

以最小的开销编译时间生成的函数调度程序

我正在尝试使用编译时生成的数组来实现快速函数调度程序,以便能够在运行时在O(1)中使用它.

一些代码行只是为了澄清:

template<int i>
void f()
  {
  // do stuff 
  }

// specialized for every managed integer 
template<>
void f<1>
{
// do stuff
}

Dispatcher<1,5,100,300> dispatcher;  
dispatcher.execute(5); // this should call f<5>()
Run Code Online (Sandbox Code Playgroud)

我们将调度器的输入数量(在这种情况下为4)调用N,并且在这种情况下调度调度器输入(300)的最大值.

我已经能够创建一个大小等于M的数组.这利用了这样一个事实:在运行时你可以做类似的事情:

dispatcher.execute(5) -> internalArray[5]();
Run Code Online (Sandbox Code Playgroud)

这当然是有效的,但对于大尺寸的阵列来说这是不可行的.

最好的方法是仅生成N个元素的数组,并做一些数学技巧将输入索引转换为第二个数组的索引.

在这个例子中,将1,5,100,300分别转换为0,1,2,3.我已经能够做一种预处理方法来改造它们,但我正在寻找一种避免这一步骤的方法.

换句话说,我认为我正在寻找某种最小的完美散列,可以在编译时以非常有效的方式用于我的特定情况(理想情况下没有任何开销,例如:goto:MyInstruction).

我不是在寻找使用虚函数,std :: map或复杂操作的替代方法.

请问是否有不清楚的事情.

PS我正在使用C++ 11,但任何想法都是受欢迎的

[编辑]我知道标签是GCC的语言扩展值.有了这些我可能能够实现我的目标,但需要一个便携式解决方案.

c++ perfect-hash template-meta-programming constexpr c++11

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