gpt4 book ai didi

C++:实例化库中的许多模板

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:06:27 26 4
gpt4 key购买 nike

我有一个库,其中有一个模板化的类:

foo.hpp:

template <size_t N>
struct Foo {
void bar();
};

foo.cpp:

template <size_t N>
void Foo<N>::bar() {
...
};

我希望针对将在 cpp 文件中定义的特定大小列表实例化编译版本。在伪代码中,像这样的东西

foo.cpp:

template <size_t N>
void Foo<N>::bar() {
...
};

for (const auto & size: {1,2,7,9})
template struct Foo<size>;

现在,我正在手动执行此操作(为每种类型实例化),但这很容易出错,因为我有几个文件应该定义为相同的大小。

我知道我可以将所有内容移至头文件,并使用一些 enable_if 来选择有效的大小。但是,我想隐藏实现细节。因此采用了当前的方法。

编辑:

FWIW,我希望避免使用宏。我认为如果您想要一系列变量(例如 1,2,3,4...),这样的方法会起作用:

template<template<size_t> class E, size_t I = 1, std::enable_if_t<I >= 5> *unused = nullptr>
bool instatiator() {
return true;
}

template<template<size_t> class E, size_t I = 1, std::enable_if_t<I < 5> *unused = nullptr>
bool instatiator() {
E<I> e;
return instatiator<E, I + 1>();
}

bool unused = instatiator<Encoder>();

但我似乎无法让它工作。

最佳答案

你可以使用 X macro方法:

valid_sizes.hpp

// Note: no include guards!!

PROCESS_SIZE(1)
PROCESS_SIZE(2)
PROCESS_SIZE(7)
PROCESS_SIZE(9)

#undef PROCESS_SIZE

foo.cpp

// ...

#define PROCESS_SIZE(n) template struct Foo<n>;
#include "valid_sizes.hpp"

bar.cpp

// ...

#define PROCESS_SIZE(n) some_other_use_of<n>;
#include "valid_sizes.hpp"

或者,您可以使用 Boost.Preprocessor 而不是手动列表:

process_sizes.hpp

#pragma once

#define PROCESS_SIZES(macro, data) BOOST_PP_SEQ_FOR_EACH(macro, data, (1)(2)(7)(9))

一些头文件

#define INSTANTIATE_CLASS(r, Name, size) template class Name<size>;

foo.cpp

#include "process_sizes.hpp"

// ...

PROCESS_SIZES(INSTANTIATE_CLASS, Foo)

bar.cpp

#include "process_sizes.hpp"

// ...

PROCESS_SIZES(INSTANTIATE_CLASS, Bar)

#define OTHER_SIZE_BASED_WORK(r, data, size) other_use_of<size>;
PROCESS_SIZES(OTHER_SIZE_BASED_WORK, whatever)

请注意,显式实例化定义必须出现在命名空间范围内,因此不可能像您尝试的 instantiator 那样将它们放在函数中。

还要注意,隐式实例化(例如在需要定义类的上下文中引用类引起的实例化)在翻译单元之外是“不可见的”,因此它不能用作替代显式实例化。

换句话说,让相同的大小列表做不同的事情需要为每次使用复制列表、使用宏或在 C++ 编译管道之外使用自定义代码生成。我认为宏是其中最简单和最易于维护的。

关于C++:实例化库中的许多模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56786920/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com