gpt4 book ai didi

c++ - 用于在 C++ 中管理平台特定代码的内联命名空间技术

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:22:11 24 4
gpt4 key购买 nike

我见过使用#ifdef 宏(例如 Eigen 库)来管理特定于平台的代码,但还没有看到有人使用“内联命名空间”来管理特定于平台的代码。

下面的github repo给出了具体的代码和使用示例。 https://github.com/dchichkov/curious-namespace-trick/wiki/Curious-Namespace-Trick

我想知道这是否是一种可行的技术,或者是否存在我看不到的陷阱。下面是代码片段:

#include <stdio.h> 

namespace project {
// arm/math.h
namespace arm {
inline void add_() {printf("arm add\n");} // try comment out
}

// math.h
inline void add_() {
//
printf("common add\n");
//
} inline namespace platform {inline void add() {add_();}}


inline void dot_() {
//
add();
//
} inline namespace platform {inline void dot() {dot_();}}
}

int main() {
project::dot();
return 1;
}

输出:

$g++ func.cpp -Dplatform=common ; ./a.out普通添加

$ g++ func.cpp -Dplatform=arm ; ./a.out ARM 添加

最佳答案

至少有两种方法可以达到相同的效果。第一个带有命名空间的。第二个 - 在类中使用静态函数。

使用命名空间:

#include <stdio.h>

namespace GenericMath
{
void add();
void dot();
}

namespace ArmMath
{
void add();

using GenericMath::dot;
}

namespace GenericMath
{
void add()
{
printf("generic add");
}

void dot()
{
Math::add();
printf("generic dot");
}
}

namespace ArmMath
{
void add()
{
printf("arm add");
}

using GenericMath::dot;
}

int main()
{
Math::dot();
return 1;
}

有类:

#include <stdio.h>

class GenericMath
{
public:
static void add();
static void dot();
};

class ArmMath : public GenericMath
{
public:
static void add();
};

void GenericMath::add()
{
printf("generic add");
}

void GenericMath::dot()
{
printf("generic dot");
Math::add();
}

void ArmMath::add()
{
printf("arm add");
}

int main()
{
Math::add();
Math::dot();
return 1;
}

IMO 内联命名空间使代码可读性差且过于冗长。

关于c++ - 用于在 C++ 中管理平台特定代码的内联命名空间技术,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34937200/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com