小编Zsa*_*sar的帖子

如何在编译时初始化浮点数组?

我已经发现了两个好方法在编译时间初始化积分阵列这里这里.

不幸的是,两者都不能直接转换为初始化浮点数组; 我发现我在模板元编程方面不够合适,无法通过反复试验来解决这个问题.

首先让我声明一个用例:

constexpr unsigned int SineLength  = 360u;
constexpr unsigned int ArrayLength = SineLength+(SineLength/4u);
constexpr double PI = 3.1415926535;

float array[ArrayLength];

void fillArray(unsigned int length)
{
  for(unsigned int i = 0u; i < length; ++i)
    array[i] = sin(double(i)*PI/180.*360./double(SineLength));
}
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,至于信息的可用性推移,这种阵列可以被宣布constexpr.

但是,对于链接的第一种方法,生成器函数f必须如下所示:

constexpr float f(unsigned int i)
{
  return sin(double(i)*PI/180.*360./double(SineLength));
}
Run Code Online (Sandbox Code Playgroud)

这意味着float需要类型的模板参数.这是不允许的.

现在,我想到的第一个想法是将float存储在一个int变量中 - 计算后数组索引没有任何反应,所以假装它们是另一种类型(只要字节长度相等) )完全没问题.

但请看:

constexpr int f(unsigned int i)
{
  float output = sin(double(i)*PI/180.*360./double(SineLength)); …
Run Code Online (Sandbox Code Playgroud)

c++ arrays templates constexpr c++14

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

获取当前或调用方法的java.lang.reflect.Executable?

如何从代码中表示的语言功能的特定实例中获取以下类型的对象:

  • java.lang.reflect.Executable
  • java.lang.reflect.Parameter

理想地,提供方法将是获取方法或获取方法本身的调用者.

请注意,我在SO上找到了两种答案:

  • 如何从给定的可执行对象获取参数(平凡!)
  • 如何从调用堆栈中获取方法的名称(不是签名!)

两者都没有帮助获取名称不唯一的特定方法的参数.

特别考虑一下这个答案这个问题如何对所选方法的选择产生影响.

现在,存在,Class.getMethod(String, Class<?>... types)但似乎没有人可以从现有的方法定义自动生成"类型"参数?

使用案例:

public class MyAssertions
{
  private static final String DEFAULT_MESSAGE_NOT_NULL = "Parameter must not be null: ";

  /* Ideal. */
  public static void notNull(Object ref, Parameter param)
  {
    if(ref == null)
      throw new IllegalArgumentException(DEFAULT_MESSAGE_NOT_NULL + param.getName());
  }

  /* Still okay. */
  public static void notNull(Object ref, Executable caller, int param)
  {
    if(ref == null)
      throw new IllegalArgumentException(DEFAULT_MESSAGE_NOT_NULL
                                       + caller.getParameters()[param].getName());
  }

  /* Hell …
Run Code Online (Sandbox Code Playgroud)

java reflection java-8

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

如何使用 std::conditional 使所有选项都具有检查/无选项是默认值

std::conditional_t可以永久嵌套:

#include <cstdint>
#include <cstring>
#include <type_traits>

enum class data_types { single_bytes, four_byte_integrals, four_byte_floats };
    
template<data_types expected_type>
std::conditional_t<expected_type == data_types::single_bytes,        uint8_t,
std::conditional_t<expected_type == data_types::four_byte_integrals, int32_t,
                                                                     float>>
parse(const uint8_t * rawBytes)
{
    using return_t = std::conditional_t<expected_type == data_types::single_bytes,        uint8_t,
                     std::conditional_t<expected_type == data_types::four_byte_integrals, int32_t,
                                                                                          float>>;
    constexpr auto length = sizeof(return_t);
    return_t result;
    std::memcpy(&result, rawBytes, length);
    return result;
}
Run Code Online (Sandbox Code Playgroud)

但是,如果所有条件均失败,则最后一个选项将作为默认情况。这可能是不希望的。

std::enable_if存在是为了在不满足条件时防止模板实例化:

#include <cstdint>
#include <cstring>
#include <type_traits>

enum class data_types { single_bytes, four_byte_integrals, four_byte_floats };

template<data_types expected_type>
std::enable_if_t<expected_type == data_types::four_byte_floats , …
Run Code Online (Sandbox Code Playgroud)

c++ c++14

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

标签 统计

c++ ×2

c++14 ×2

arrays ×1

constexpr ×1

java ×1

java-8 ×1

reflection ×1

templates ×1