标签: constexpr

C++ constexpr在编译时

我是否认为只应在编译时评估此函数,或者是否存在运行时成本?

template <typename T>
size_t constexpr CompID() {
    return typeid(T).hash_code();
}

struct Foo {};

int main(int argc, const char * argv[]) {
    size_t foo = CompID<Foo>();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c++ templates constexpr c++11

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

C++ 11类型到枚举映射?

我有一个像:

enum E
{
    TYPE_FLOAT,
    TYPE_CHAR,
    TYPE_INT
}
Run Code Online (Sandbox Code Playgroud)

我想创建一个编译时映射,以获得适合类型的E:

GetE<float> // returns TYPE_FLOAT
GetE<char> // returns TYPE_CHAR
GetE<int> // returns TYPE_INT
Run Code Online (Sandbox Code Playgroud)

我想到了:

template<class T> struct GetE;

template<> struct GetE<float> { static constexpr E type = TYPE_FLOAT; };
template<> struct GetE<char> { static constexpr E type = TYPE_CHAR; };
template<> struct GetE<int> { static constexpr E type = TYPE_INT; };
Run Code Online (Sandbox Code Playgroud)

但我得到的错误如下:

undefined reference to `GetE<int>::type'
Run Code Online (Sandbox Code Playgroud)

什么是最好的方法呢?为什么错误呢?

c++ constexpr c++11

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

静态类成员的初始化.为什么constexpr?

当我想要一个静态指针作为我需要constexpr进行初始化的类的成员时nullptr.

class Application {
    private:
        constexpr static Application* app = nullptr;
}
Run Code Online (Sandbox Code Playgroud)

有人可以解释我为什么需要这样做吗?我无法找到为什么静态变量必须在编译时存在的确切原因.

c++ initialization static-members constexpr c++11

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

通过通用引用传递静态constexpr变量?

在下面,static constexpr成员L在类中初始化A,然后通过值或(通用)引用传递.后者在Clang中失败但在GCC中失败,并且成员/非成员函数的行为略有不同.更详细:

#include <iostream>

using namespace std;

struct A
{
    static constexpr size_t L = 4;

    template <typename T>
    void member_ref(T&& x) { cout << std::forward<T>(x) << endl; }

    template <typename T>
    void member_val(T x) { cout << x << endl; }
};

template <typename T>
void ref(T&& x) { cout << std::forward<T>(x) << endl; }

template <typename T>
void val(T x) { cout << x << endl; }

int main ()
{
    A().member_ref(A::L); …
Run Code Online (Sandbox Code Playgroud)

c++ static-members one-definition-rule constexpr c++11

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

自定义文字使用long double但不是double,并且传递值但不通过引用传递

我正在尝试使用C++自定义文字.我发现奇怪的是,当我将类型从long double类型更改为double或者尝试通过引用传递时,下面的简单函数停止工作.

起初我认为它与使用有关,constexpr但似乎并非如此,因为如果它们不在,这两种工作都很好operator "",并且constexpr从中operator ""删除不会删除错误.

这些经过深思熟虑的决策是在语言设计中,还是仅仅是我的编译器(gcc 4.8.2)无法处理的细微差别?

// Conversion function, works fine with both long double and
// double, and with or without pass by reference.
constexpr long double to_deg (const long double& deg)
{
    return deg*M_PI/180.0;
}

// Custom literal with long double types and pass by value,
// works fine.
constexpr long double operator "" _deg (long double deg)
{
    return deg*M_PI/180.0;
}

// Custom literal …
Run Code Online (Sandbox Code Playgroud)

c++ literals user-defined-literals constexpr c++11

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

const和constexpr最终会是同一个东西吗?

我刚刚读了答案

const vs constexpr关于变量

我正在观看关于C++ 11/14 功能的谷歌技术讲座,其中有人说,在功能方面,未来可能不需要constexpr,因为编译器会逐步发现它们自己解决问题.最后,我知道Java编译器和JVM很难弄清楚类(或任何变量)在构造之后是不可变的 - 没有你明确地这么说 - 并且基于这个事实进行各种恶意优化.

所以,这里有一个问题:const和constexpr的命运最终会是同一个东西吗?也就是说,即使编译器不能保证进行运行时初始化等,它最终也不会这样做(基本上)吗?当发生这种情况时,其中一个关键字不会是多余的吗?(就像内联正在变成,也许)?

c++ const compile-time-constant constexpr c++11

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

模板非类型参数推导

是否有可能推导出c ++ 17函数的模板值(而不是类型)?

函数foo:

template<int I>
int foo()
{
    return (I);
}
Run Code Online (Sandbox Code Playgroud)

可以通过以下方式调用

foo<5>();
Run Code Online (Sandbox Code Playgroud)

并将返回5.

模板类型可以通过函数参数的类型推断出来.是否可以以某种方式对模板值执行相同操作?例如:

template<int I = x>
int bar(const int x)
{
    return (I);
}
Run Code Online (Sandbox Code Playgroud)

这显然不会起作用(因为x在声明之前需要一个),但是可能会有一些C++ 17技巧可以实现这一点吗?

我想用它来设置常量表达式函数参数.

c++ templates constexpr template-argument-deduction c++17

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

有没有办法将`constexpr`值传递给lambda,以便在lambda中保持`constexpr`?

这就是我想要做的; 发布整个代码,因为它不会太长,也是为了演示我正在尝试解决的具体任务.基本上,我需要一种方法来从参数包中按索引迭代值(索引部分很重要,即使在本例中不需要).

#include <iostream>
#include <tuple>
#include <type_traits>

template <int First, int Last, typename Functor>
constexpr void static_for(Functor&& f)
{
    if constexpr (First < Last)
    {
        f(std::integral_constant<int, First>{});
        static_for<First + 1, Last, Functor>(std::forward<Functor>(f));
    }
}

template <size_t index, typename... Args>
auto value_by_index(Args&&... args) noexcept {
    return std::get<index>(std::forward_as_tuple(std::forward<Args>(args)...));
}

template <typename... ValueTypes>
void traverse(ValueTypes... values)
{
    static_for<0, sizeof...(ValueTypes)>([&](int i) {
        auto v = value_by_index<static_cast<size_t>(i), ValueTypes...>(values...);
        std::cout << v << std::endl;
    });
}

int main()
{
    traverse(0.0f, 1, 3.33, "str");

    return 0; …
Run Code Online (Sandbox Code Playgroud)

c++ templates template-meta-programming constexpr c++17

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

Clang在编译时不为非constexpr变量求值constexpr函数的值

一些代码:

constexpr int sum(int a, int b) {
    return a + b;
}

int main() {
    int a = sum(4, 5);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我使用编译此代码,clang-9int a在编译时不评估main函数的值。如果我使用constexpr int aclang在编译时对其进行评估,但我无法在运行时更改此变量。

但是在编译时gcc-7.1评估的值int a

为什么会这样呢?如何解决?

c++ clang constexpr

5
推荐指数
2
解决办法
165
查看次数

在转发引用上调用时,自定义类型转换运算符不起作用(当按值传递对象时起作用)

我无法理解此错误的实质,因此,如果标题更好,请原谅。此代码无法编译:

template <auto v>
struct value_as_type {
    using type = decltype(v);    
    static constexpr type value {v};
    constexpr operator type() const {
        return v;
    }
};

template <int First, int Last, typename Functor>
constexpr void static_for([[maybe_unused]] Functor&& f)
{
    if constexpr (First < Last)
    {
        f(value_as_type<First>{});
        static_for<First + 1, Last, Functor>(std::forward<Functor>(f));
    }
}

template <class... FieldsSequence>
struct DbRecord
{
private:
    static constexpr bool checkAssertions()
    {
        static_assert(sizeof...(FieldsSequence) > 0);
        static_for<1, sizeof...(FieldsSequence)>([](auto&& index) {
            constexpr int i = index;
            static_assert(i > 0 && …
Run Code Online (Sandbox Code Playgroud)

c++ rvalue-reference constexpr pass-by-rvalue-reference c++17

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