只有已知执行路径的模板编译

Having a template compile for only known execution path

本文关键字:编译 路径 执行      更新时间:2023-10-16

在下面的示例中,即使我知道已知的执行路径将是"安全"的,我也有一个问题。"安全"是指我知道我只会以这种方式使用它。是否有算法或更好的方法来构建场景,即使我知道我永远不会有" 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),因为您将浮子传递给了该功能。