C++ if constexpr vs 模板特化
C++ if constexpr vs template specialization
考虑这两个例子
示例 1
template<Type type>
static BaseSomething* createSomething();
template<>
BaseSomething* createSomething<Type::Something1>()
{
return Something1Creator.create();
}
template<>
BaseSomething* createSomething<Type::Something2>()
{
return Something2Creator.create();
}
.... // other somethings
示例 2
template<Type type>
static BaseSomething* createSomething()
{
if constexpr(type == Type::Something1)
{
return Something1Creator.create();
}
else if constexpr(type == Type::Something2)
{
return Something2Creator.create();
}
// Other somethings
}
我知道这两个示例在概念上 相同,但考虑到这些功能在 SomethingFactory.hpp
文件中,我的 main.cpp
包含它。
在 main.cpp
中,我可能只创建类型 Something1
而不知道其他 Something
类型存在。
我真的关心我的可执行文件的大小 最后。您认为我应该采用哪种模式才能使可执行文件的大小最小化?还是这些都没什么大不了的,反正我们都注定了?
What do you think which pattern shall I take for my executable to be at minimal size?
在这两种情况下,如果您只实例化 createSomething<Type::Something1>
,您将得到一个实际上是一行代码的函数定义。
I really do care about size of my executable in the end
然后去掉static
。模板函数是隐式内联的,但是 static
函数对于每个翻译单元都有唯一的副本。
I know that these two examples are conceptually the same
他们不是。
createSomething<void>
是使用 Example2 定义的函数,使用 Example 1.
未定义
考虑这两个例子
示例 1
template<Type type>
static BaseSomething* createSomething();
template<>
BaseSomething* createSomething<Type::Something1>()
{
return Something1Creator.create();
}
template<>
BaseSomething* createSomething<Type::Something2>()
{
return Something2Creator.create();
}
.... // other somethings
示例 2
template<Type type>
static BaseSomething* createSomething()
{
if constexpr(type == Type::Something1)
{
return Something1Creator.create();
}
else if constexpr(type == Type::Something2)
{
return Something2Creator.create();
}
// Other somethings
}
我知道这两个示例在概念上 相同,但考虑到这些功能在 SomethingFactory.hpp
文件中,我的 main.cpp
包含它。
在 main.cpp
中,我可能只创建类型 Something1
而不知道其他 Something
类型存在。
我真的关心我的可执行文件的大小 最后。您认为我应该采用哪种模式才能使可执行文件的大小最小化?还是这些都没什么大不了的,反正我们都注定了?
What do you think which pattern shall I take for my executable to be at minimal size?
在这两种情况下,如果您只实例化 createSomething<Type::Something1>
,您将得到一个实际上是一行代码的函数定义。
I really do care about size of my executable in the end
然后去掉static
。模板函数是隐式内联的,但是 static
函数对于每个翻译单元都有唯一的副本。
I know that these two examples are conceptually the same
他们不是。
createSomething<void>
是使用 Example2 定义的函数,使用 Example 1.