半通用功能

Fre*_*ner 4 c++ generics function

我有一堆重载函数,可以处理某些数据类型,如int,double和strings.这些函数中的大多数执行相同的操作,其中仅允许一组特定的数据类型.这意味着我无法创建一个简单的通用模板函数,因为我失去了类型安全性(并且可能会导致函数内的验证运行时问题).

是否可以创建"半通用编译时类型安全功能"?如果是这样,怎么样?如果没有,这是否会出现在C++ 0x中?

一个(无效的)想法;

template <typename T, restrict: int, std::string >
void foo(T bar);
...
foo((int)0); // OK
foo((std::string)"foobar"); // OK
foo((double)0.0); // Compile Error
Run Code Online (Sandbox Code Playgroud)

注意:我意识到我可以创建一个具有重载构造函数和赋值运算符的类,并将该类的变量传递给函数.

Joh*_*itb 5

使用sfinae

template<typename> struct restrict { };
template<> struct restrict<string> { typedef void type; };
template<> struct restrict<int> { typedef void type; };

template <typename T>
typename restrict<T>::type foo(T bar);
Run Code Online (Sandbox Code Playgroud)

foo将只能接受stringintT.如果调用foo(0.f),则不会发生硬编译时错误,而是如果有另一个接受该参数的函数,则会改为执行该编译.