修复C++14兼容性问题& 逻辑检查

解决办法:特化类型的输出

cpp 复制代码
#include <iostream>
#include <string>
#include <vector>
#include <memory>
#include <map>

// 模拟Alembic的V3f类型
struct MockV3f {
    float x, y, z;
    MockV3f(float x_, float y_, float z_) : x(x_), y(y_), z(z_) {}
};

// 模拟Alembic的V2f类型
struct MockV2f {
    float x, y;
    MockV2f(float x_, float y_) : x(x_), y(y_) {}
};

// 模拟属性基类
class MockProperty {
protected:
    std::string name;
    
public:
    MockProperty(const std::string& propName) : name(propName) {}
    virtual ~MockProperty() = default;
    const std::string& getName() const { return name; }
    virtual void printValue() const = 0;
};

// 模拟标量属性
template<typename T>
class MockScalarProperty : public MockProperty {
private:
    T value;
    
public:
    MockScalarProperty(const std::string& propName, const T& val) 
        : MockProperty(propName), value(val) {}
    
    void set(const T& val) { value = val; }
    T get() const { return value; }
    
    void printValue() const override {
        std::cout << "  " << name << ": " << value << std::endl;
    }
};

// 特化bool类型的输出
template<>
void MockScalarProperty<bool>::printValue() const {
    std::cout << "  " << name << ": " << (value ? "true" : "false") << std::endl;
}

// 模拟数组属性
template<typename T>
class MockArrayProperty : public MockProperty {
private:
    std::vector<T> values;
    
public:
    MockArrayProperty(const std::string& propName) : MockProperty(propName) {}
    
    void set(const std::vector<T>& vals) { values = vals; }
    const std::vector<T>& get() const { return values; }
    
    void printValue() const override {
        std::cout << "  " << name << " (" << values.size() << " 个元素):" << std::endl;
        for (size_t i = 0; i < values.size(); ++i) {
            std::cout << "    [" << i << "]: " << values[i] << std::endl;
        }
    }
};

// 特化V3f类型的输出
template<>
void MockArrayProperty<MockV3f>::printValue() const {
    std::cout << "  " << name << " (" << values.size() << " 个元素):" << std::endl;
    for (size_t i = 0; i < values.size(); ++i) {
        std::cout << "    [" << i << "]: (" << values[i].x << ", " << values[i].y << ", " << values[i].z << ")" << std::endl;
    }
}

// 特化V2f类型的输出
template<>
void MockArrayProperty<MockV2f>::printValue() const {
    std::cout << "  " << name << " (" << values.size() << " 个元素):" << std::endl;
    for (size_t i = 0; i < values.size(); ++i) {
        std::cout << "    [" << i << "]: (" << values[i].x << ", " << values[i].y << ")" << std::endl;
    }
}

// 模拟复合属性
class MockCompoundProperty : public MockProperty {
private:
    std::map<std::string, std::unique_ptr<MockProperty>> properties;
    
public:
    MockCompoundProperty(const std::string& propName) : MockProperty(propName) {}
    
    template<typename T>
    void addScalarProperty(const std::string& name, const T& value) {
        properties[name] = std::make_unique<MockScalarProperty<T>>(name, value);
    }
    
    template<typename T>
    void addArrayProperty(const std::string& name, const std::vector<T>& values) {
        auto prop = std::make_unique<MockArrayProperty<T>>(name);
        prop->set(values);
        properties[name] = std::move(prop);
    }
    
    MockProperty* getProperty(const std::string& name) {
        auto it = properties.find(name);
        return it != properties.end() ? it->second.get() : nullptr;
    }
    
    void printValue() const override {
        std::cout << "  " << name << " (复合属性):" << std::endl;
        for (const auto& pair : properties) {
            pair.second->printValue();
        }
    }
};

int main() {
    try {
        std::cout << "=== Alembic 属性模拟测试 ===" << std::endl;
        
        // 创建复合属性容器
        MockCompoundProperty deskProps("desk_properties");
        
        // ==================== 写入标量属性 ====================
        std::cout << "\n1. 写入标量属性:" << std::endl;
        
        deskProps.addScalarProperty("desk_height", 0.75);
        std::cout << "  设置desk_height为: 0.75" << std::endl;
        
        deskProps.addScalarProperty("desk_width", 1.2);
        std::cout << "  设置desk_width为: 1.2" << std::endl;
        
        deskProps.addScalarProperty("material_name", std::string("Oak Wood"));
        std::cout << "  设置material_name为: Oak Wood" << std::endl;
        
        deskProps.addScalarProperty("is_movable", true);
        std::cout << "  设置is_movable为: true" << std::endl;
        
        // ==================== 写入数组属性 ====================
        std::cout << "\n2. 写入数组属性:" << std::endl;
        
        std::vector<MockV3f> vertices = {
            {0.0f, 0.0f, 0.0f}, {1.2f, 0.0f, 0.0f}, {1.2f, 0.0f, 0.6f}, {0.0f, 0.0f, 0.6f}
        };
        deskProps.addArrayProperty("desk_vertices", vertices);
        std::cout << "  写入" << vertices.size() << "个顶点位置" << std::endl;
        
        std::vector<MockV2f> uvs = {
            {0.0f, 0.0f}, {1.0f, 0.0f}, {1.0f, 1.0f}, {0.0f, 1.0f}
        };
        deskProps.addArrayProperty("desk_uvs", uvs);
        std::cout << "  写入" << uvs.size() << "个UV坐标" << std::endl;
        
        // ==================== 读取属性 ====================
        std::cout << "\n--- 读取属性 ---" << std::endl;
        
        // 读取标量属性
        auto heightProp = dynamic_cast<MockScalarProperty<double>*>(deskProps.getProperty("desk_height"));
        if (heightProp) {
            std::cout << "  读取desk_height: " << heightProp->get() << std::endl;
        }
        
        auto widthProp = dynamic_cast<MockScalarProperty<double>*>(deskProps.getProperty("desk_width"));
        if (widthProp) {
            std::cout << "  读取desk_width: " << widthProp->get() << std::endl;
        }
        
        auto materialNameProp = dynamic_cast<MockScalarProperty<std::string>*>(deskProps.getProperty("material_name"));
        if (materialNameProp) {
            std::cout << "  读取material_name: " << materialNameProp->get() << std::endl;
        }
        
        auto movableProp = dynamic_cast<MockScalarProperty<bool>*>(deskProps.getProperty("is_movable"));
        if (movableProp) {
            std::cout << "  读取is_movable: " << (movableProp->get() ? "true" : "false") << std::endl;
        }
        
        // 读取数组属性
        auto verticesProp = dynamic_cast<MockArrayProperty<MockV3f>*>(deskProps.getProperty("desk_vertices"));
        if (verticesProp) {
            const auto& vertices_read = verticesProp->get();
            std::cout << "  读取" << vertices_read.size() << "个顶点位置:" << std::endl;
            for (size_t i = 0; i < vertices_read.size(); ++i) {
                const auto& vertex = vertices_read[i];
                std::cout << "    顶点" << i << ": (" << vertex.x << ", " << vertex.y << ", " << vertex.z << ")" << std::endl;
            }
        }
        
        auto uvsProp = dynamic_cast<MockArrayProperty<MockV2f>*>(deskProps.getProperty("desk_uvs"));
        if (uvsProp) {
            const auto& uvs_read = uvsProp->get();
            std::cout << "  读取" << uvs_read.size() << "个UV坐标:" << std::endl;
            for (size_t i = 0; i < uvs_read.size(); ++i) {
                const auto& uv = uvs_read[i];
                std::cout << "    UV" << i << ": (" << uv.x << ", " << uv.y << ")" << std::endl;
            }
        }
        
        // ==================== 显示所有属性 ====================
        std::cout << "\n--- 所有属性 ---" << std::endl;
        deskProps.printValue();
        
        // ==================== 总结 ====================
        std::cout << "\n=== 测试总结 ===" << std::endl;
        std::cout << "✓ 成功写入和读取标量属性 (double, string, bool)" << std::endl;
        std::cout << "✓ 成功写入和读取数组属性 (V3f, V2f)" << std::endl;
        std::cout << "✓ 模拟属性系统工作正常" << std::endl;
        std::cout << "\n注意:这是一个模拟版本,用于演示属性概念。" << std::endl;
        std::cout << "要使用真实的Alembic库,请安装依赖:sudo apt-get install libalembic-dev libhdf5-dev" << std::endl;
        
    } catch (const std::exception& e) {
        std::cerr << "错误: " << e.what() << std::endl;
        return 1;
    }
    
    return 0;
}
相关推荐
不知道累,只知道类12 分钟前
深入理解 Java 虚拟线程 (Project Loom)
java·开发语言
国强_dev35 分钟前
Python 的“非直接原因”报错
开发语言·python
YMatrix 官方技术社区35 分钟前
YMatrix 存储引擎解密:MARS3 存储引擎如何超越传统行存、列存实现“时序+分析“场景性能大幅提升?
开发语言·数据库·时序数据库·数据库架构·智慧工厂·存储引擎·ymatrix
项目題供诗43 分钟前
C语言基础(一)
c++
玖疯子1 小时前
技术文章大纲:Bug悬案侦破大会
开发语言·ar
独自破碎E1 小时前
解释一下NIO、BIO、AIO
java·开发语言·nio
草莓熊Lotso1 小时前
脉脉独家【AI创作者xAMA】|当豆包手机遭遇“全网封杀”:AI学会操作手机,我们的饭碗还保得住吗?
运维·开发语言·人工智能·智能手机·脉脉
@areok@1 小时前
C++opencv图片(mat)传入C#bitmap图片
开发语言·c++·opencv
散峰而望1 小时前
【Coze - AI Agent 开发平台】-- 你真的了解 Coze 吗
开发语言·人工智能·python·aigc·ai编程·ai写作
鸽芷咕1 小时前
【2025年度总结】时光知味,三载同行:落笔皆是沉淀,前行自有光芒
linux·c++·人工智能·2025年度总结