模板特化后如何解决编译不过的问题

模板特化后如何解决编译不过的问题
现有一个库函数提供几个方法:

double get_double();
void set_double(double);
const char* get_string();
void set_string(const char*);

我自己在程序中使用了一个类型函数,比如

enum type {
DUBLE,
STRING,
};

(实际情况可能不止这两种类型)
现在我写了两个模板函数

template<typename T>
void set_value(type t, T value) {
 switch(t) {
  case DOUBLE:
    set_double((double)value);
    break;
  case STRING:
    set_string((const char*)value);
    break;
 }
}
template<typename T>
void get_value(type t, T& value) {
 switch(t) {
  case DOUBLE:
    value = (T)get_double();
    break;
  case STRING:
    value = (T)get_string();
    break;
 }
}

困扰我的问题是,看case中的强制类型转换,现在我的其他代码中如果不调用get_value/set_value则能编译通过
但是一旦我调用了set_value/get_value,比如

set_value<double>(type::DOUBLE, 10.0);

那么编译器立马提示,无法从“T”转换为“const char” / 无法从“const char”转为“T”,
这里T是double类型,问题是,我在这里只需要调用case DOUBLE:部分代码,但是编译器仍旧会
编译所有case分支代码,导致强制类型转换不通过
模板可能需要连库函数都是模板才能正常编译通过,但我没法更改库函数。
请问是我对库函数封装设计的问题,还是什么问题,可以不用模板解决这个问题吗?

参考一下,你语法写的不对

查了资料,这个问题和 https://www.656463.com/wenda/Cwfsylxwtjdmbhscshlxwchardlxwdou_410 这个问题相同
不论switch/case还是<typeinfo>中的typeid都是运行期分支,因此这里只能使用模板偏特化的特性为每个类型写一个偏特化函数进行调用
C++20之后可以使用constexpr if语句,该语句是编译期分支,不满足条件则不编译。如果非得只使用一个模板函数则可以考虑使用,参考
https://www.zhihu.com/question/459943046
https://blog.csdn.net/fpcc/article/details/128625744