我想定义以NTuples作为参数但具有大小约束的函数.
这个想法是宣布像:
foo(x::NTuple{K-1,Int},y::NTuple{K,Int}) where {K} = "ok"
Run Code Online (Sandbox Code Playgroud)
然而,这不是正确的Julia代码.
我的问题是:如何在朱莉娅中定义这种功能?
(仅用于说明目的):对于C++编码器,我的问题等同于"如何翻译这种C++代码
template <size_t N>
foo(const std::array<int, N-1>& x, const std::array<int, N>& y)
{ ... }
Run Code Online (Sandbox Code Playgroud)
进入格式良好的朱莉娅代码."
在SF ++中使用C++ 11中的方法检测,我写了这个小小的运行示例:
#include <type_traits>
struct Foo
{
Foo();// = delete;
Foo(int);
void my_method();
};
template <typename T, typename ENABLE = void>
struct Detect_My_Method
: std::false_type
{
};
template <typename T>
struct Detect_My_Method<T, decltype(T().my_method())>
: std::true_type
{
};
int main()
{
static_assert(!Detect_My_Method<double>::value, "");
static_assert(Detect_My_Method<Foo>::value, "");
}
Run Code Online (Sandbox Code Playgroud)
按预期工作.
但是,如果我删除Foo的空构造函数:
struct Foo
{
Foo() = delete;
Foo(int);
void my_method();
};
Run Code Online (Sandbox Code Playgroud)
该示例不再工作,我收到此错误消息:
g++ -std=c++11 declVal.cpp
declVal.cpp: In function ‘int main()’:
declVal.cpp:33:3: error: static assertion failed
static_assert(Detect_My_Method<Foo>::value, "");
Run Code Online (Sandbox Code Playgroud)
问题:解释以及如何解决?
在 C++17 中我知道我可以写:
#include <type_traits>
struct A
{
size_t operator()(double x) const { return 1; };
};
int main()
{
static_assert(std::is_invocable_r_v<size_t, A, double>);
}
Run Code Online (Sandbox Code Playgroud)
但是现在我想使用std::is_invocable来测试任意方法(此处为方法)的存在size(double):
#include <type_traits>
struct A
{
size_t size(double x) const { return 1; };
};
int main()
{
static_assert(std::is_invocable_r_v<size_t, ???, double>);
}
Run Code Online (Sandbox Code Playgroud)
问题是“???”该如何填写?让它发挥作用?