强制编译器只接受编译时参数(浮点)

ar2*_*015 7 c++ templates c++11

我可以强制编译器只接受constexpr函数的一个或非变量输入吗?

我正在寻找只允许编译函数的时间值.使用模板或任何其他方法.

这里有一个int模板的工作示例.doubles 的问题是它们不能用作模板参数.

#include <iostream>

template <double x>
void show_x()
{
    std::cout<<"x is always "<<x<<" in the entire program."<<std::endl;
}

int main()
{
    show_x<10.0>();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

错误:'double'不是模板非类型参数的有效类型


更新

对于那些将此问题标记为重复的人,我不得不说:

我问问题

如何解决问题A?

解决方案B不适用于问题A,我需要另一种解决方案

然后你链接我为什么解决方案B不起作用.

那是完全不合逻辑的.

M.M*_*M.M 4

我不确定你到底想要什么,但这是一种拒绝函数调用中非常量表达式的方法。不幸的是,它使用了一个由于名称污染而不好的宏,但也许如果你给你的函数一个奇怪的名称,那么它不会造成太大伤害:

void f(double d) {}
#define f(x) do { constexpr decltype(x) var = x; f(var); } while (0)

int main() 
{
    f(1.0);      // OK
    f(1 + 2);    // OK, constant expression with implicit conversion
    double e = 5.0;
    f(e);        // compilation error, `e` is not a constant expression
}
Run Code Online (Sandbox Code Playgroud)

如果您想拒绝不完全double类型的常量表达式,那也是可能的(从您的问题中不确定这是否是一个要求)。