gpt4 book ai didi

c++ - 禁用默认模板并仅通过 sfinae 使用特化

转载 作者:搜寻专家 更新时间:2023-10-31 01:42:49 25 4
gpt4 key购买 nike

考虑以下系统:

template<typename T>
struct wrapper
{
operator T * () { return nullptr; }
};

template<typename Ret, typename T>
Ret func(T);

template<>
int func(float * in)
{
std::cout << "long";
}

template<>
long func(float * in)
{
std::cout << "int";
}

包装器的目的是允许它衰减到模板化的类型(它是围绕该类型缓冲区的包装器)。此外,我有一组函数,它们是模板的模板化特化。这是为了避免仅基于返回类型进行重载时的常见错误。

但这不起作用,正如此处所述:

// the following should work, but doesn't because it's instantiating 
// the func<ret, wrapper<float>> which doesn't exist resulting in a linker error
// instead of selecting the int func(float *) overload
wrapper<float> w;
func<int>(w);

相反,我希望这会生成一个编译时错误(但同样,它会生成一个链接时错误):

// the following should generate a compile-time error
// since no explicit overload for int func(int *) exists
wrapper<int> w2;
func<int>(w2);

所以理想情况下,我想禁用原始模板(如果可能的话,可能通过 sfinae?)这样重载决策只考虑显式特化,如果没有找到匹配则生成编译时错误。这能做到吗?

clang 和 msvc 之间的可移植解决方案是必须的,但我使用的是两者的最新版本。

最佳答案

另一种方法可能是使用 static_assert:

template<typename Ret, typename T>
Ret func(T) {
static_assert(false, "template specialization required");
}

关于c++ - 禁用默认模板并仅通过 sfinae 使用特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26220144/

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