不幸的是,两者都不能直接转换为初始化浮点数组; 我发现我在模板元编程方面不够合适,无法通过反复试验来解决这个问题.
首先让我声明一个用例:
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) 如何从代码中表示的语言功能的特定实例中获取以下类型的对象:
理想地,提供方法将是获取方法或获取方法本身的调用者.
请注意,我在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) 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)