构建类似std::pair的数据结构

2022-02-07  本文已影响0人  FredricZhu

CMakeLists.txt

cmake_minimum_required(VERSION 2.6)

if(APPLE)
    message(STATUS "This is Apple, do nothing.")
elseif(UNIX)
    message(STATUS "This is linux, set CMAKE_PREFIX_PATH.")
    set(CMAKE_PREFIX_PATH /vcpkg/ports/cppwork/vcpkg_installed/x64-linux/share)
endif(APPLE)

project(duo1)

add_definitions(-std=c++17)

add_definitions(-g)

find_package(ZLIB)

find_package(glog REQUIRED)

find_package(OpenCV REQUIRED )

find_package(Boost REQUIRED COMPONENTS
    system
    filesystem
    serialization
    program_options
    thread
    )

find_package(DataFrame REQUIRED)

if(APPLE)
    MESSAGE(STATUS "This is APPLE, set INCLUDE_DIRS")
set(INCLUDE_DIRS ${Boost_INCLUDE_DIRS} /usr/local/include /usr/local/iODBC/include /opt/snowflake/snowflakeodbc/include/ ${CMAKE_CURRENT_SOURCE_DIR}/../../include/ {CMAKE_CURRENT_SOURCE_DIR}/../)
elseif(UNIX)
    MESSAGE(STATUS "This is linux, set INCLUDE_DIRS")
    set(INCLUDE_DIRS ${Boost_INCLUDE_DIRS} /usr/local/include ${CMAKE_CURRENT_SOURCE_DIR}/../../include/ ${CMAKE_CURRENT_SOURCE_DIR}/../)
endif(APPLE)


if(APPLE)
    MESSAGE(STATUS "This is APPLE, set LINK_DIRS")
    set(LINK_DIRS /usr/local/lib /usr/local/iODBC/lib /opt/snowflake/snowflakeodbc/lib/universal)
elseif(UNIX)
    MESSAGE(STATUS "This is linux, set LINK_DIRS")
    set(LINK_DIRS ${Boost_INCLUDE_DIRS} /usr/local/lib /vcpkg/ports/cppwork/vcpkg_installed/x64-linux/lib)
endif(APPLE)

if(APPLE)
    MESSAGE(STATUS "This is APPLE, set ODBC_LIBS")
    set(ODBC_LIBS iodbc iodbcinst)
elseif(UNIX)
    MESSAGE(STATUS "This is linux, set LINK_DIRS")
    set(ODBC_LIBS odbc odbcinst ltdl)
endif(APPLE)

include_directories(${INCLUDE_DIRS})
LINK_DIRECTORIES(${LINK_DIRS})

file( GLOB main_file_list ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp) 

file( GLOB APP_SOURCES  ${CMAKE_CURRENT_SOURCE_DIR}/*.h ${CMAKE_CURRENT_SOURCE_DIR}/*.hpp ${CMAKE_CURRENT_SOURCE_DIR}/../../include/http/impl/*.cpp ${CMAKE_CURRENT_SOURCE_DIR}/../../include/yaml/impl/*.cpp ${CMAKE_CURRENT_SOURCE_DIR}/../../include/df/impl/*.cpp ${CMAKE_CURRENT_SOURCE_DIR}/../../include/death_handler/impl/*.cpp)

add_library(${PROJECT_NAME}_lib SHARED ${APP_SOURCES})
target_link_libraries(${PROJECT_NAME}_lib ${Boost_LIBRARIES} ZLIB::ZLIB glog::glog DataFrame::DataFrame ${OpenCV_LIBS})
target_link_libraries(${PROJECT_NAME}_lib  ssl crypto libgtest.a pystring libyaml-cpp.a libgmock.a ${ODBC_LIBS} libnanodbc.a pthread dl backtrace)

foreach( main_file ${main_file_list} )
    file(RELATIVE_PATH filename ${CMAKE_CURRENT_SOURCE_DIR} ${main_file})
    string(REPLACE ".cpp" "" file ${filename})
    add_executable(${file}  ${main_file})
    target_link_libraries(${file} ${PROJECT_NAME}_lib)
endforeach( main_file ${main_file_list})

duo1.hpp

#ifndef _FREDRIC_DUO1_HPP_
#define _FREDRIC_DUO1_HPP_

template <typename T1, typename T2>
class Duo {
    public:
        using Type1 = T1;
        using Type2 = T2;
        enum { N = 2 };
    
    private:
        T1 value1;
        T2 value2;

    public:
        Duo(): value1(), value2() {}

        Duo(T1 const& a, T2 const& b): value1{a}, value2{b} {}
        
        template <typename U1, typename U2>
        Duo(Duo<U1, U2> const& d): value1{d.v1()}, value2{d.v2()} {}

        template <typename U1, typename U2>
        Duo<T1, T2>& operator=(Duo<U1, U2> const& d) {
            value1 = d.v1();
            value2 = d.v2();
            return *this;
        }

        T1& v1() {
            return value1;
        }

        T1 const& v1() const {
            return value1;
        }

        T2& v2() {
            return value2;
        }

        T2 const& v2() const {
            return value2;
        }
};

template <typename T1, typename T2, 
    typename U1, typename U2>
inline bool operator==(Duo<T1, T2> const& d1, Duo<U1, U2> const& d2) {
    return d1.v1() == d2.v1() && d1.v2() == d2.v2();
}

template <typename T1, typename T2, 
    typename U1, typename U2>
inline bool operator!=(Duo<T1, T2> const& d1, Duo<U1, U2> const& d2) {
    return !(d1==d2);
}

template <typename T1, typename T2>
inline Duo<T1, T2> make_duo(T1 const& a, T2 const& b) {
    return Duo<T1, T2>(a, b);
}

#endif

main.cpp

#include "duo1/duo1.hpp"

#include <iostream>

Duo<float, int> foo() {
    return make_duo(42.0f, 42);
}

int main(int argc, char* argv[]) {
    if(foo() == make_duo(42, 42.0f)) {
        std::cout << "Two duos are equal..." << std::endl;
    } else {
        std::cout << "Two duos are not equal..." << std::endl;
    }
    
    return EXIT_SUCCESS;
}

程序输出如下,


image.png
上一篇下一篇

猜你喜欢

热点阅读