小编dre*_*rel的帖子

是否可以在未评估的上下文中获取Julia函数的返回类型?

我想在不评估函数的情况下在Julia中获取函数调用的结果类型,并使用该类型。所需用法如下所示:

foo(x::Int32) = x
foo(x::Float32) = x

y = 0.0f0
# Assert that y has the type of result of foo(Float32)
y::@resultof foo(Float32) # This apparently does not work in Julia
Run Code Online (Sandbox Code Playgroud)

虽然在上述情况下,我可以简单地使用y::typeof(foo(1.0f0))虚拟变量的评估,但在更复杂的情况下,初始化虚拟变量可能会带来不便和昂贵。例如,我想使用function返回的迭代器类型eachline(filename::AbstractString; keep::Bool=false),但是使用typeoftrue确实需要成功打开文件,这看起来有些过头了。

从C ++的背景来看,我要问的是std::result_of在Julia 中是否有一个等效项。问题几乎与此相同,但语言是朱莉娅。


经过一些研究,我发现Julia在一个函数中允许不同类型的返回值,其中类型推断看起来非常困难。例如,

foo(x::Int64) = x == 1 ? 1 : 1.0
Run Code Online (Sandbox Code Playgroud)

现在,返回类型可以是Int64或Float64,具体取决于输入值。不过,在这种情况下,我仍然想知道是否有一些宏技巧可以推断出返回类型为Union{ Int64, Float64 }?。


总而言之,我的问题是:

  1. 从根本上讲,是否可以仅通过在Julia中提供参数类型来获得函数返回类型?
  2. 如果不可能为1,则对于具有一种确定性返回类型的函数(如第一个示例中所示),可以不对返回类型求值吗?
  3. (可能与我想要的无关,但我认为它可以增进我的理解)编译Julia代码时,是否知道函数的返回类型?还是仅在运行时确定类型信息?

julia

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

模板变量C数组完全专业化应该指定数组大小吗?

我正在尝试实现具有以下特征的模板化C数组:

// template definition
template< int a, int b > constexpr int    arr[]       = { 1 };

// partial specialization, works ok
template< int b >        constexpr double arr<0, b>[] = { 2.0 };

// full specialization, compile error in MSVC, ok in g++
template< >              constexpr float  arr<1, 0>[] = { 3.0f };
Run Code Online (Sandbox Code Playgroud)

我将Visual Studio 2017和MSVC编译器与C ++标准设置为C ++ 17一起使用,并且编译器抱怨了C2133: 'arr<1,0>': unknown size,因此将大小添加1到完整的专业化解决了该错误。但是,它会在带有-pedantic标志的Ubuntu g ++ 8.1.0下进行编译。

我认为,对函数和类的完全专业化的行为就好像定义了非模板版本一样,因此我想这也应适用于变量模板,并且上面的完全专业化可以等同于(名称除外)

constexpr float arr_with_a1_and_b0[] = { 3.0f }; …
Run Code Online (Sandbox Code Playgroud)

c++ language-lawyer list-initialization template-variables c++17

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