小编Gui*_*cot的帖子

Cmake add_compile_definitions 但适用于所有目标

有没有办法在 cmake 中为创建的所有目标创建定义。到目前为止当我

add_compile_definitions(MYDEFINITION)
Run Code Online (Sandbox Code Playgroud)

在我的根 CmakeLists.txt 中,它似乎只为该文件中创建的目标创建这些定义。但我想为子目录中创建的所有目标创建定义。做这个的最好方式是什么?

c c++ cmake

6
推荐指数
1
解决办法
3282
查看次数

完美转发仿函数

我想知道使用完美转发仿函数的正确方法是什么?这是两个代码段.哪一个是最好的,如果不是,哪个是最好的形式?

template<typename T, typename... Args>
void callMe(T&& func, Args&&... args) {
    func(std::forward<Args>(args)...);
}
Run Code Online (Sandbox Code Playgroud)

要么

template<typename T, typename... Args>
void callMe(T&& func, Args&&... args) {
    std::forward<T>(func)(std::forward<Args>(args)...);
}
Run Code Online (Sandbox Code Playgroud)

编辑:

它会影响重载分辨率吗?如果funcoperator()具有REF-预选赛&&或者const &,我应该做的后一个版本,我应该关心哪些超载我打电话?

谢谢!

c++ templates functor perfect-forwarding

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

如何从 cmake 中运行 cmake?

我的项目依赖于mariadb-connector-c,我正在尝试使用 cmake 自动化下载、构建和链接过程。

我目前将项目下载到一个目录中,然后我尝试执行 generate ninja 文件并运行它们,但我根本无法运行 cmake:

execute_process(COMMAND "cmake -GNinja ." WORKING_DIRECTORY ${mariadb-connector-c_SOURCE_DIR})
Run Code Online (Sandbox Code Playgroud)

我知道这不起作用,因为下一步运行 ninja 失败了:

execute_process(COMMAND "ninja" WORKING_DIRECTORY ${mariadb-connector-c_SOURCE_DIR})
Run Code Online (Sandbox Code Playgroud)

cmake 在 CLI 中运行良好,我尝试使用 cmake 可执行文件的完整路径并将点替换为完整目录的变量(如果您想知道,这也是一个有效变量。)

如何告诉 cmake 在该外部项目上运行 cmake?

cmake

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

将指定的模板类型作为模板参数传递

说我有一些模板类型......

template <typename T> struct Foo {
    Foo(T t) {}
};
Run Code Online (Sandbox Code Playgroud)

有没有办法将指定的Foo类型传递给函数,以便函数可以直接看到T?

理想情况下,我可以写这样的东西......

Foo<int> foo = create<Foo<int>>();
Run Code Online (Sandbox Code Playgroud)

我能来的最接近的是

template <
    template <typename> typename TT,
    typename T,
    std::enable_if_t<std::is_same<TT<T>, Foo<T>>::value, int> = 0
>
Foo<T> create() {
    return Foo<T>(T());
}
Run Code Online (Sandbox Code Playgroud)

然后将使用像

Foo<int> foo = create<Foo, int>();
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助.

c++ templates template-templates c++14

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

为什么 std::string_view 没有模板构造函数?

我正在阅读 的文档std::string_view,我注意到这些是构造函数:

constexpr basic_string_view() noexcept;
constexpr basic_string_view(const basic_string_view& other) noexcept = default;
constexpr basic_string_view(const CharT* s, size_type count);
constexpr basic_string_view(const CharT* s);
Run Code Online (Sandbox Code Playgroud)

为什么他们不介绍这个呢?

template<std::size_t n>
constexpr basic_string_view(const CharT(&s)[n]) : basic_string_view(s, n) {}
Run Code Online (Sandbox Code Playgroud)

在大多数情况下,它将节省对 的调用strlen()。有什么原因没有被引入吗?

c++ c++17

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

如何在不导致实例化的情况下获取函数模板的签名?

我想知道是否有特定的规则指定此代码是否应该失败:

struct Foo {
    template<typename T>
    int bar() {
        static_assert(!std::is_same<T, float>::value, "Don't send floats please.");
        return 0;
    }

    int baz() { return 0; }
};

int main() {
    using function_type = decltype(&Foo::bar<float>);

    function_type func = &Foo::baz;
    (void) func;
}
Run Code Online (Sandbox Code Playgroud)

这个例子在GCC和Clang都失败了.为什么它必须失败?看起来采用函数的类型不应该导致实例化,甚至更少触发静态断言.为什么会失败?还有另一种方法来获取函数模板的签名而不会导致它的实体实例化吗?

我的用例是反映功能模板的签名.我的代码的用户使用一些参数调用我的代码.然后,我将这些参数与函数的模板参数匹配以获取其签名,然后使用签名来提取尚未发送的参数的类型.

当函数通过转发引用时,没有问题.但是,如果该函数按值接收参数,我应该发送std::decay_t<Arg>模板参数,以免在函数体中导致编译错误.但是我无法知道我是否通过参考值接收签名的函数而没有进一步的反射功能.如果我可以获得函数模板的签名而不会导致它的实例化,那将是完美的.

c++ decltype c++11

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

到处使用共享指针有哪些陷阱?

我们的代码库使用许多向量。其中一些向量彼此共享对象,即它们包含std::shared_ptr共享对象。问题是:代码库仍处于活跃的开发阶段,通常需要将一些包含值的向量重写为包含共享指针的向量。这很乏味。所以我想出了一个想法:简单地将所有向量作为共享指针的向量。

问题是:可以吗?我应该注意哪些注意事项?会出现什么问题?

我做了一些简单且可能幼稚的测量,在初始化和查询值向量和共享指针向量时,它们之间的性能实际上没有区别。

如果性能不是问题,还有什么我应该注意的吗?

c++ pointers vector

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

提升等待:如何等待帖子内的异步操作

我正在编写一些 asio 代码并尝试重构它以使用 C++20 协程。然而我在转换这段代码时遇到了困难:

asio::post(
    my_strand,
    [self = shared_from_this()]() {
        // functions that write in this container can only be called
        // on a single thread at a time, thus the strand
        session_write_history.push_back(buffer);
        /* co_await? */ socket.write_async(buffer, /* use awaitable? */);
    }
);
Run Code Online (Sandbox Code Playgroud)

您会看到,我的异步操作是在后回调内完成的,因此asio::use_awaitable在异步操作上使用将使回调成为一个协程。有没有办法等待asio::post链上的异步操作?

c++ boost-asio c++20 c++-coroutine

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

如何将 C 风格的编译时数组转换为 std::array

在我们的资料中,我们经常有这样的事情:

static const int g_numbers[]{ 1, 2, 3, 4, 5};
static const struct
{
    const int         m_nID;
    const char* const m_pszName;
}
g_collection[]
{
    { 1, "Max" },
    { 2, "Fabian" },
    { 3, "Martin" },
    …
};
Run Code Online (Sandbox Code Playgroud)

如何将这些编译时数组转换为现代 C++?使用例如std::array

如果我理解正确, std::array 需要一个大小作为模板参数。

您建议采用哪种方式以最小的开销(例如代码生成)和不必要的冗余信息来转换此类代码?

c++ arrays c++17

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

使用函数参数使用常量表达式作为模板参数:哪个编译器是正确的?

我有这段代码:

template <int V>
struct Constant {
    constexpr operator int() const noexcept { return V; }
};


template <class T, int N>
struct Array { };

auto function(auto s) -> Array<int, s + s> {
    return {};
}

auto const a = function(Constant<3>{});
Run Code Online (Sandbox Code Playgroud)

让我最悲伤的是,似乎只有 Clang 接受这个代码。

哪个编译器是正确的,为什么?

c++ templates language-lawyer constexpr c++20

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