c++ 多个模板参数的高效显式模板实例化

问题描述 投票:0回答:1

我正在编写一个 C++ 库,在其中处理大量模板化类和自由函数。示例(标头+包含自由函数的源文件):

#ifndef MY_FUNCTION_HPP
#define MY_FUNCTION_HPP

#include <vector>
#include <array>
#include <map>
#include <string>
#include <iostream>

template <unsigned int dim, typename NumberType>
void process_data(const std::array<std::vector<NumberType>, dim>& data,
                  std::map<std::string, std::array<NumberType, dim>>& results);

#endif // MY_FUNCTION_HPP

// my_function.cc
#include "my_function.hpp"

// Implementation of the template function
template <unsigned int dim, typename NumberType>
void process_data(const std::array<std::vector<NumberType>, dim>& data,
                  std::map<std::string, std::array<NumberType, dim>>& results)
{}

// Explicit instantiations for dim = 2 and dim = 3, and NumberType = double
template void process_data<2, double>(const std::array<std::vector<double>, 2>&, 
                                      std::map<std::string, std::array<double, 2>>&);
template void process_data<3, double>(const std::array<std::vector<double>, 3>&, 
                                      std::map<std::string, std::array<double, 3>>&);

该函数可能有不同的模板参数(此处为

dim
NumberType
),我想将其实例化为固定值(
dim=2
dim=3
NumberType = double
)。如果有一堆带有许多参数和类的免费函数需要实例化,那么手动执行此操作会很乏味,并且会破坏源文件。

还有类似的问题,例如这里,但我正在寻找一个通用的解决方案,其中

  1. 函数参数是任意数据类型(取决于模板参数)并且
  2. 这些功能取决于一个或多个模板参数。

我还阅读了有关 Boost.preprocessor 的内容,但我不确定它是否适用于此。

c++ preprocessor explicit-instantiation
1个回答
0
投票

该函数可能有不同的模板参数(此处为 dim 和 NumberType),我想将其实例化为固定值(dim=2 和 dim=3 和 NumberType = double)。

在这种情况下,您可以在标头中仅公开非模板重载:

#ifndef MY_FUNCTION_HPP
#define MY_FUNCTION_HPP

#include <array>
#include <map>
#include <string>
#include <vector>

void process_data(const std::array<std::vector<double>, 2>&, 
                  std::map<std::string, std::array<double, 2>>&);
void process_data(const std::array<std::vector<double>, 3>&, 
                  std::map<std::string, std::array<double, 3>>&);

#endif // MY_FUNCTION_HPP

然后在源文件中:

#include "my_function.hpp"

namespace {
// Implementation of the template function
template <unsigned int dim, typename NumberType>
void process_data_impl(const std::array<std::vector<NumberType>, dim>& data,
                  std::map<std::string, std::array<NumberType, dim>>& results)
{
    //...
}

}

void process_data(const std::array<std::vector<double>, 2>& a, 
                  std::map<std::string, std::array<double, 2>>& m)
{
    process_data_impl(a, m);
}
void process_data(const std::array<std::vector<double>, 3>& a, 
                  std::map<std::string, std::array<double, 3>>& m)
{
    process_data_impl(a, m);
}
© www.soinside.com 2019 - 2024. All rights reserved.