gpt4 book ai didi

c++ - 如何获得类似 C++ 模板的行为但只允许实例化两种特定类型?

转载 作者:太空狗 更新时间:2023-10-29 19:51:25 25 4
gpt4 key购买 nike

我正在尝试从内联 C++ 函数中获取特定类型的行为,但我不确定是否有办法做到这一点。

我希望我的函数接受有符号或无符号的 16 位值作为参数,对该值执行操作,然后返回相同类型的值。如果参数的有符号/无符号是不明确的(例如,因为它是一个常量),那么编译器只选择有符号的版本就可以了。这是一个玩具程序,展示了我第一次尝试获得这种行为:

 #include <iostream>
#include <cstdint>

int16_t getValuePlusOne( int16_t x) {return x+1;}
uint16_t getValuePlusOne(uint16_t x) {return x+1;}

using namespace std;

int main(int, char **)
{
int16_t signedVal = -15;
uint16_t unsignedVal = 23;

cout << getValuePlusOne( signedVal) << endl; // works, yay!
cout << getValuePlusOne(unsignedVal) << endl; // works, yay!
cout << getValuePlusOne(1234) << endl; // COMPILE ERROR, ambiguous! D'oh!
return 0;
}

这样几乎可以正常工作,但它在 getValuePlusOne(1234) 上出错,因为 1234 是不明确的(它可以是有符号的或无符号的)。很公平,但我不希望这样做。

所以这是我的第二次尝试:

#include <iostream>
#include <cstdint>

template <typename T> T getValuePlusOne(T val) {return val+1;}

using namespace std;

int main(int, char **)
{
int16_t signedVal = 5;
uint16_t unsignedVal = 5;

cout << getValuePlusOne( signedVal) << endl; // works, yay!
cout << getValuePlusOne(unsignedVal) << endl; // works, yay!
cout << getValuePlusOne(1234) << endl; // works, yay!

uint32_t inappropriateType32 = 54321;
cout << getValuePlusOne(inappropriateType32) << endl; // works, but I want this to be a compile-time error! D'oh!

float inappropriateTypeFloat = 666.0;
cout << getValuePlusOne(inappropriateTypeFloat) << endl; // works, but I want this to be a compile-time error!

return 0;
}

对于前三个调用 getValuePlusOne(),这个版本的工作方式正是我希望它工作的方式——它们编译时没有错误,模板机制确保 getValuePlusOne() 的返回类型与其参数类型相匹配,并选择一个不明确情况下的默认参数/返回类型。耶!

但是 -- 这个版本还允许用户传递不合适的值(例如 32 位整数,甚至 -- gasp -- 浮点类型),这在我的应用程序的上下文中没有意义,所以我希望编译器将这些调用标记为编译时错误,而此实现不会发生这种情况。

有什么办法让我既能吃到我的蛋糕又能吃到?

最佳答案

像这样的东西怎么样?

template <typename T> T getValuePlusOne(T val)
{
static_assert(std::is_same<T, int16_t>::value || std::is_same<T, uint16_t>::value, "Incorrect type");
return val+1;
}

getValuePlusOne(1234) 仍然失败。但这不是因为类型不明确。这是因为 Tint

关于c++ - 如何获得类似 C++ 模板的行为但只允许实例化两种特定类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44426301/

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