gpt4 book ai didi

c++ - 使用不同的 enable_if 条件选择成员函数

转载 作者:太空宇宙 更新时间:2023-11-04 12:30:22 25 4
gpt4 key购买 nike

我正在尝试根据类模板参数确定调用哪个版本的成员函数。我试过这个:

#include <iostream>
#include <type_traits>

template<typename T>
struct Point
{
void MyFunction(typename std::enable_if<std::is_same<T, int>::value, T >::type* = 0)
{
std::cout << "T is int." << std::endl;
}

void MyFunction(typename std::enable_if<!std::is_same<T, int>::value, float >::type* = 0)
{
std::cout << "T is not int." << std::endl;
}
};

int main()
{
Point<int> intPoint;
intPoint.MyFunction();

Point<float> floatPoint;
floatPoint.MyFunction();
}

我认为这是在说“如果 T 是 int,则使用第一个 MyFunction,如果 T 不是 int,则使用第二个 MyFunction,但是我得到编译器错误,说“错误:'struct std::中没有名为'type'的类型: enable_if'”。谁能指出我在这里做错了什么?

最佳答案

enable_if 起作用是因为 substitution of a template argument resulted in an error ,因此从重载决策集中删除替换,编译器只考虑其他可行的重载。

在您的示例中,在实例化成员函数时没有发生替换,因为此时模板参数 T 已经已知。实现您所尝试的目标的最简单方法是创建一个默认为 T 的虚拟模板参数,并使用它来执行 SFINAE。

template<typename T>
struct Point
{
template<typename U = T>
typename std::enable_if<std::is_same<U, int>::value>::type
MyFunction()
{
std::cout << "T is int." << std::endl;
}

template<typename U = T>
typename std::enable_if<std::is_same<U, float>::value>::type
MyFunction()
{
std::cout << "T is not int." << std::endl;
}
};

编辑:

正如 HostileFork 在评论中提到的那样,原始示例可能会导致用户显式指定成员函数的模板参数并获得不正确的结果。以下应防止编译成员函数的显式特化。

template<typename T>
struct Point
{
template<typename... Dummy, typename U = T>
typename std::enable_if<std::is_same<U, int>::value>::type
MyFunction()
{
static_assert(sizeof...(Dummy)==0, "Do not specify template arguments!");
std::cout << "T is int." << std::endl;
}

template<typename... Dummy, typename U = T>
typename std::enable_if<std::is_same<U, float>::value>::type
MyFunction()
{
static_assert(sizeof...(Dummy)==0, "Do not specify template arguments!");
std::cout << "T is not int." << std::endl;
}
};

关于c++ - 使用不同的 enable_if 条件选择成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58897511/

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