小编Reg*_*lez的帖子

来自整数的可变参数模板参数

鉴于我有那种类型

template<int ...Is>
struct A {};
Run Code Online (Sandbox Code Playgroud)

我可以A<0, 1, 2, 3, 4, 5,..., d>仅从整数d “生成”类型吗?

我想到了类似的东西

template<int d>
struct B : A<std::index_sequence<d>...> {}
Run Code Online (Sandbox Code Playgroud)

但这不起作用。

另一种选择是手动专门化:

template<int d>
struct B;

template<>
struct B<0>: A<> {};

template<>
struct B<1>: A<0> {};

template<>
struct B<2>: A<0, 1> {};

template<>
struct B<3>: A<0, 1, 2> {};
Run Code Online (Sandbox Code Playgroud)

但显然我不能写 B<3000> b;

[实际]我的用例比这更复杂。我不想重新实现std :: integer_sequence,但是要更复杂一些。

c++ variadic-templates

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

C#语句可以生成未连接的MSIL

问题是有关C#语言规范CIL语言规范,以及Microsoft和Mono的C#编译器行为。

我正在构建一些可在CIL上运行的代码分析工具(无论如何)。

考虑一些代码示例,我注意到代码语句(try / catch,ifelse,ifthen,loop,...)生成MSIL的连接块。

但是我想确定我不能编写产生非连接MSIL的C#代码构造。更具体地说,我可以编写任何转换为(类似)的C#语句

IL_0000: 
IL_0001: 
IL_0002: 

// hole

IL_001a: 
IL_001b:
Run Code Online (Sandbox Code Playgroud)

我已经使用goto嵌套循环尝试过一些奇怪的东西,但是也许我不像某些用户那样生气。

c# compiler-construction cil

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

nuget仅包含内容文件

我想创建一个nuget包(来自一些c#项目),但我不想嵌入生成的dll,而只是一些静态文件.

我在我的nuspec文件末尾添加了一个标签,但是nuget pack命令继续将project.dll嵌入到包中.问题是我不希望这个dll被发布.

有没有办法做到这一点?

谢谢,

雷吉斯

package nuget

6
推荐指数
2
解决办法
3451
查看次数

为什么short/int/long中有一个额外的整数类型?

直到最近,我认为'long'与'int'是一回事,因为历史原因和台式机处理器都至少有32位(并且只有那种"欺骗"才有麻烦,因为它只在32位机器上开发).

读到这个,我发现,实际上,C标准将int类型定义为至少为int16,而'long'应该至少为int32.

实际上在列表中

  • 短符号整数类型.能够至少包含[-32767,+ 32767]范围
  • 基本有符号整数类型.能够至少包含[-32767,+ 32767]范围;
  • 长签名整数类型.能够至少包含[-2147483647,+ 2147483647]范围
  • 长签名整数类型.能够至少包含[-9223372036854775807,+ 9223372036854775807]范围;

总是存在非空交叉点,因此无论编译器和平台选择何种实现,都是重复的.

为什么标准委员会在char/short/int/long(或int_k,int_2k,int_4k,int_8k)之类的简单介绍中引入了额外的类型?

这是出于历史原因,例如,gcc xx将int实现为32位而另一个编译器将其实现为16,或者是否存在我缺少的真正技术原因?

c standards integer

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

关于指针的指针 - 性能损失的原因

我回答了这个问题,并注意到我认为是编译器的奇怪行为.

我第一次写这个程序(作为我答案的一部分):

class Vector {
private:
  double** ptr;


public:

  Vector(double** _ptr): ptr(_ptr) {}

  inline double& operator[](const int iIndex) const {
    return *ptr[iIndex];
  }
};

extern "C" int test(const double a);

int main() {
    double a[2] = { 1.0, 2.0 };
    Vector va((double**) &a);

    double a1 = va[0];
    test(a1);

    double a2 = va[0];
    test(a2);
}
Run Code Online (Sandbox Code Playgroud)

在编译时生成两个加载指令:

clang -O3 -S -emit-llvm main.cpp -o main.ll
Run Code Online (Sandbox Code Playgroud)

这可以在llvm-IR中看到(并且可以在程序集中看到):

    define i32 @main() #0 {
    entry:
      %a.sroa.0.0.copyload = load double*, double** bitcast ([2 x double]* …

c++ optimization pointers inline clang

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

将文件的部分内容移动到其他文件并保留 git 历史记录

我有一个具有复杂历史的大文件(许多作者的许多提交)。

重构它应该将其分割成多个小文件,但是,我需要保留历史记录。

为了解决这个问题,假设我有一个main包含所有代码的文件:

function a() {}
function b() {}
function c() {}
function main() {
   a();
   b();
   c();
}
Run Code Online (Sandbox Code Playgroud)

我需要将ab函数分别移动到ab文件,同时将我的main函数保留在main文件中——同时将历史记录保留在三个文件中。

我在那里找到了某种解决方案,但在生产环境中没有任何实际有效或实用的解决方案。

git

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

Fortran 可分配的内部存储器表示

我想知道 fortran 可分配数组的内部存储器表示是什么。

我理解这比原始指针更复杂一点,因为形状和等级也必须存储。

我还猜测它依赖于实现,因为我在Fortran 2003 标准中找不到信息

但是,我想知道使用哪种结构来表示可分配数组(即使只针对一个编译器)。

我知道这个问题有点宽泛,但我们将不胜感激。

fortran allocatable-array

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

添加两个可变参数模板的整数列表

鉴于这种类型

template<std::size_t N, int ...content>
struct list {
    inline int reduce() {
        int result = 0;
        constexpr int arr[N] = { content... };
        for(std::size_t k = 0; k < N; ++k) {
            result += arr[k];
        }

        return result;
    }
};
Run Code Online (Sandbox Code Playgroud)

我想实现一个function add,该函数返回一个新列表,其中包含两个输入列表的逐元素相加。换句话说(伪代码):

add([a0, a1, a2], [b0, b1]) -> [a0 + b0, a1 + b2, a2]
Run Code Online (Sandbox Code Playgroud)

问题:

  • 我什至不知道如何声明这种函数的返回类型
  • 我不知道是否有可能

c++ variadic-templates

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

取可变参数模板参数的尾部

给定此类型:

template<typename ...As>
struct Base {};
Run Code Online (Sandbox Code Playgroud)

我需要实现一个功能

template<int i, typename ...As>
constexpr auto Tail() {
   static_assert(i < sizeof...(As), "index out of range");
   return ??;
}
Run Code Online (Sandbox Code Playgroud)

它返回一个B使用index中的类型参数列表尾部的实例i

例如,

Tail<0, int, float, double>() -> Base<int, float, double>
Tail<1, int, float, double>() -> Base<float, double>
Tail<2, int, float, double>() -> Base<double>
Tail<3, int, float, double>() -> fails with static assert
Run Code Online (Sandbox Code Playgroud)

我知道如何在索引处获取类型i

template <int64_t i, typename T, typename... Ts>
struct type_at
{
    static_assert(i < sizeof...(Ts) + 1, "index …
Run Code Online (Sandbox Code Playgroud)

c++ template-meta-programming variadic-templates

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

将方法作为参数传递时,无法推断类型参数

我有这段简单的代码:

class Program
{
    static void test<T1>(Action<T1> action) { }

    static void test<T1, T2>(Action<T1, T2> action) {  }

    static void B(int a) { }
    static void C(string a, int b) { }

    static void Main(string[] args)
    {
        test(B);
        test(C);
    }
}
Run Code Online (Sandbox Code Playgroud)

由于两个错误而无法编译:

The type arguments for method 'Program.test<T1>(Action<T1>)' cannot be
inferred from the usage. Try specifying the type arguments explicitly.
The type arguments for method 'Program.test<T1>(Action<T1>)' cannot be
inferred from the usage. Try specifying the type arguments explicitly.
Run Code Online (Sandbox Code Playgroud)

当然,如果我明确指定类型参数,它将起作用。

test<int>(B); …

c# generics

5
推荐指数
0
解决办法
71
查看次数