gpt4 book ai didi

c++11 - Sfinae 和模板特化

转载 作者:行者123 更新时间:2023-12-02 02:39:39 24 4
gpt4 key购买 nike

我想在我的库中提供一个函数:

namespace Foo {
template<typename G>
typename std::enable_if<std::is_fundamental<G>::value, std::vector<uint8_t>>::type toBytes(const G &g) {
//something here
}
}

但是我只想为基本类型提供基本实现。如果用户想要添加特化,我认为在用户代码中编写就足够了:
namespace Foo {
template<>
std::vector<uint8_t> toBytes<struct A>(const struct A &g) {
//something here
}
}

但是它不能编译,Gcc 提供了这个错误:

std::vector Foo::toBytes(const A&)’ does not match any template declaration



我错过了什么吗?

最佳答案

我会使用 C++20 特性 Concept . Concept s 自然也支持模板特化:

#include <iostream>

namespace detail {
template<typename T, typename U >
concept SameHelper = std::is_same_v<T, U>;
}

template<typename T, typename U >
concept same_as = detail::SameHelper<T, U> && detail::SameHelper<U, T>;

template<typename T>
concept fundamental = same_as<T, bool> || same_as<T, char>;

template<typename T>
void toBytes(T) {std::cout << "I am not fundamental" << std::endl;}

template<fundamental T>
void toBytes(T){std::cout << "I am fundamental" << std::endl;}


int main() {
toBytes(true);
toBytes('c');
toBytes(1);
}

You can run the code online查看以下输出:
I am fundamental
I am fundamental
I am not fundamental

关于c++11 - Sfinae 和模板特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60587494/

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