我想要一种简单的方法来将固定大小的浮点数组按元素相乘。我编写了以下代码来尝试实现此目的:
\n#include <array>\n#include <cstdint>\n\ntemplate <uint16_t N>\nusing color = std::array<float,N>;\n\ntemplate <uint16_t N>\nconstexpr color<N> operator* (color<N> lhs, const color<N>& rhs)\n{\n for (int i = 0; i < N; i++){\n lhs[i] *= rhs[i];\n }\n return lhs;\n};\n\nint main()\n{\n constexpr uint16_t N = 10;\n\n color<N> myColor{1,2,3,4,5,6,7,8,9,10};\n color<N> myColor2{2,4,6,8,10,12,14,16,18,20};\n \n color<N> mult = myColor * myColor2;\n\n return 0;\n};\nRun Code Online (Sandbox Code Playgroud)\n使用 gcc 编译时,出现以下错误:
\ntest.cpp: In function \xe2\x80\x98int main()\xe2\x80\x99:\ntest.cpp:23:29: error: no match for \xe2\x80\x98operator*\xe2\x80\x99 (operand types are \xe2\x80\x98color<10>\xe2\x80\x99 {aka \xe2\x80\x98std::array<float, 10>\xe2\x80\x99} and \xe2\x80\x98color<10>\xe2\x80\x99 {aka \xe2\x80\x98std::array<float, 10>\xe2\x80\x99})\n …Run Code Online (Sandbox Code Playgroud) 我有一个基本上都是模板化的项目。然而,我知道一个事实是,99% 的用户只需要可能实例化的特定子集。
例如,我有一个Camera类,99% 的用户只会将其实例化为以下类型之一:
Camera<float,Mono>
Camera<float,RGB>
Camera<double,Mono>
Camera<double,RGB>
Run Code Online (Sandbox Code Playgroud)
但是,有一些小众用户需要使用以下内容:
Camera<float, Spectrum<N>>
Run Code Online (Sandbox Code Playgroud)
其中N仅针对用户的特定程序才知道。
过去,我使用显式实例化,我知道我想要的实例化的特定子集,这极大地加快了编译时间,并允许我将实现与头文件分开。(我非常喜欢仅声明头文件以提高可读性)。
然而在这里,因为我想要这种灵活性,所以我将其保留为仅包含标题的模板。
是否可以为已知情况提供显式实例化以帮助加快编译时间,同时仍然允许用户在绝对需要时指定自己的隐式实例化?
我正在考虑的另一种选择是完全显式实例化(将所有定义移至文件中.cpp),然后显式实例化:
Camera<float, Spectrum<SPECTRAL_BIN_COUNT>
Run Code Online (Sandbox Code Playgroud)
可以SPECTRAL_BIN_COUNT通过 a 设置#define。(如果没有设置,将简单地默认为某个值)。
我对后者的担忧是,将来我可能需要一些额外的灵活性,因此希望模板实例化能够完全灵活。
我的理解是,在现代 C++ 中,最好使用throw而不是返回错误代码。也就是说,如果我有一些功能:
void MyFunction(int foo, double bar){
// Do some stuff....
if (exception_criteria_met){
throw "Call to MyFunction with inputs" << foo << " and " << bar << " failed because ...";
}
};
Run Code Online (Sandbox Code Playgroud)
这是否意味着,为了正确处理这个问题,那么在所有调用 的函数中MyFunction,我必须实现如下所示的内容:
void MyOuterFunction(int foo){
// Do some stuff...
try {
MyFunction(foo, bar);
} catch (const char * exception_message) {
throw "Call to MyOuterFunction with inputs " << foo << " failed because call to MyFunction with ....";
};
Run Code Online (Sandbox Code Playgroud)
那么这是否意味着我必须对调用该函数调用堆栈的所有函数一直执行相同类型的错误处理? …