只有已知执行路径的模板编译
Having a template compile for only known execution path
在下面的示例中,即使我知道已知的执行路径将是"安全"的,我也有一个问题。"安全"是指我知道我只会以这种方式使用它。是否有算法或更好的方法来构建场景,即使我知道我永远不会有" float"的" float"," float"以1?
的方式传递给特别是我遇到的错误是
error C2248: 'foo::foo' : cannot access private member declared in class 'foo'
测试案例示例
#include <vector>
using namespace std;
class foo {
private:
foo(float val) {
val = 99.0f;
}
public:
foo(int val) {
val = 2;
}
};
template<typename Type>
struct bar {
public:
vector<Type> array;
void Add(Type value) {
array.push_back(value);
}
};
class bunny {
bar<float> floats;
bar<foo> foos;
public:
template<typename Type>
void Initialize(int kind, Type value) {
if(kind == 0)
floats.Add(value);
else if(kind == 1)
foos.Add(value);
}
};
int main(void) {
bunny first; first.Initialize(0, 1.0f);
//bunny second; second.Initialize(1, 0);
return 0;
}
在C 中,您可以具有具有相同名称但数量或类型的参数的多个函数,例如,您可以具有两个函数:
void foo(float a)
{
std::cout << "Float!" << a << std::endl;
}
void foo(int a)
{
std::cout << "Int!" << a << std::endl;
}
如果您调用以下功能之一,则编译器将根据您对函数的参数来推论要调用的函数。这就是称为功能超载。
在您的情况下,您可能可以将您的兔子类改写为这样的东西:
class bunny {
bar<float> floats;
bar<foo> foos;
public:
void Initialize(foo value) {
foos.Add(value);
}
void Initialize(float value) {
floats.Add(value);
}
};
如果您致电first.Initialize(1.0f)
,则编译器知道他需要调用void Initialize(float value)
,因为您将浮子传递给了该功能。
相关文章:
- 基于编译器选项的编译二进制路径
- 良好做法:如何定义用于编译的外部库的路径
- 如何更改 clang 的预编译头文件的路径
- Qt 静态编译无法读取路径
- 只有已知执行路径的模板编译
- 已编译的 protobuf 文件的意外输出路径
- 崇高文本 3 - 在终端中编译并运行 C++ 程序(路径包含空格)
- 使用 glibc 2.7 包含路径编译失败
- 将库安装到编译中未包含的路径后,编译失败
- GCC makefile 编译和语法。如何调用 c 编译器以及包含多个路径
- 如果库的包含路径设置不符合预期,如何引发编译错误
- 编译C++中动态链接库,存在运行路径问题
- Simple_ls.cpp的C++Boost编译错误-未找到对Boost的引用::文件系统::路径::文件名
- 在MacOS上编译一个动态库,库搜索路径指向同一目录(CMake)
- GCC - 多个预编译标头和特定路径
- 在C++中编译时提供库路径的更好方法
- 已编译的应用想要从绝对路径加载 DLL
- Qt 创建者编译错误"找不到 UIC.exe从 msvc 2012 路径"
- 在 mingw 下编译时出现路径查找文件名错误
- G++ libc.so 绝对路径交叉编译错误